在C#中将一个分隔符字符串转换为字典<string,string>

55

我有一个格式为“key1=value1;key2=value2;key3=value3;”的字符串。

我需要将其转换为包含上述键值对的字典。

最好的方法是什么?谢谢。


5个回答

111

像这样的吗?

var dict = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries)
               .Select(part => part.Split('='))
               .ToDictionary(split => split[0], split => split[1]);

当然,如果假设不满足,这个方法会失败。例如,如果文本的格式不正确,可能会抛出IndexOutOfRangeException异常;如果存在重复的键,则会抛出ArgumentException异常。每种情况都需要进行不同的修改。如果可能存在多余的空格,则您可能需要使用string.Trim调用来进行必要的修整。


2
这可能对一些人来说很明显,但你需要包含 System.Linq 来使用 Select() - colin0117

29

更新Ani的代码以考虑末尾的分号。where子句将确保在创建条目之前具有键和值。

var dictionary = "key1=value1;key2=value2;key3=value3;"
    .Split(';')
    .Select (part  => part.Split('='))
    .Where (part => part.Length == 2)
    .ToDictionary (sp => sp[0], sp => sp[1]);

20

你可以使用JSON字符串来实现,例如:

var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}");

[最佳解决方案]。我更喜欢将数值以JSON格式呈现,而不是随意的文本。谢谢。 - Nour Lababidi

12

欣赏正则表达式令人惊叹的忽略空白、纠正最后一个值是否带有分号的功能:

        var dict = Regex.Matches("key1 = value1; key2 = value2 ; key3 = value3", @"\s*(.*?)\s*=\s*(.*?)\s*(;|$)")
        .OfType<Match>()
        .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);

但是说真的,Ani值得赞扬使用了 .ToDictionary()。我从来没有想过会用到这个方法。


9
你可以这样编写代码或循环遍历来完成。无论哪种方式,最终你都要用;将项目成对拆分,然后再用=将键和值拆分出来。
string input = "key1=value1;key2=value2;key3=value3;";
Dictionary<string, string> dictionary =
    input.TrimEnd(';').Split(';').ToDictionary(item => item.Split('=')[0], item => item.Split('=')[1]);

循环版本:

Dictionary<string, string> dictionary = new Dictionary<string, string>();
string[] items = input.TrimEnd(';').Split(';');
foreach (string item in items)
{
    string[] keyValue = item.Split('=');
    dictionary.Add(keyValue[0], keyValue[1]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接