51

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

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

解决此问题的最佳方法是什么?谢谢。

4

5 回答 5

109

像这样的东西?

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

当然,如果不满足假设,这将失败。例如,IndexOutOfRangeException如果文本格式不正确,可能会抛出 an,ArgumentException如果存在重复键,则会抛出 an。这些场景中的每一个都需要不同的修改。如果可能存在多余的空白,您可能需要string.Trim根据需要进行一些调用。

于 2010-11-10T04:36:48.763 回答
27

更新了 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]);
于 2010-11-10T04:45:58.007 回答
16

您可以使用 JSON 字符串执行此操作,例如:

var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}");
于 2016-04-10T16:07:44.210 回答
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() 的支持。我永远不会想到这一点。

于 2010-11-10T05:36:50.787 回答
8

你可以这样写或循环它自己做。无论哪种方式。最终,您将拆分;以获取项目对,然后=继续获取键和值。

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]);
}
于 2010-11-10T04:36:39.867 回答