从List <string> </string> </string,string>初始化Dictionary <string,string>

时间:2014-01-07 02:40:05

标签: c# generics dictionary extension-methods

最简单的方法,也许是通过扩展方法? :

var MyDic = new Dictionary<string,string>{ "key1", "val1", "key2", "val2", ...}; 

如果词典结束,条目包含来自简单字符串列表的键和值对,则交替每隔一个字符串作为键和值。

4 个答案:

答案 0 :(得分:10)

交替有点痛苦。 就个人而言我只是手写:

var dictionary = new Dictionary<string, string>();
for (int index = 0; index < list.Count; index += 2)
{
    dictionary[list[index]] = list[index + 1];
}

你肯定可以使用LINQ来做它,但它会更复杂 - 我喜欢使用LINQ,因为它使事情更简单,但有时候它不太适合。

(显然你可以把它包装成扩展方法。)

请注意,如果有重复的密钥,您可以使用dictionary.Add(list[index], list[index + 1])抛出异常 - 上述代码将默默使用特定密钥的 last 出现。

答案 1 :(得分:2)

您可以使用列表长度的一半,ToDictionary从列表中的项目创建字典:

Dictionary<string, string> dictionary =
  Enumerable.Range(0, list.Count / 2)
  .ToDictionary(i => list[i * 2], i => list[i * 2 + 1]);

答案 2 :(得分:2)

LINQ和GroupBy版本:

var dict = source.Select((s, i) => new { s, i })
                 .GroupBy(x => x.i / 2)
                 .ToDictionary(g => g.First().s, g => g.Last().s);

答案 3 :(得分:1)

如果您需要LINQ - 您可以先将Zip列表发送给自己:

var result = list.Where((item, id) => id % 2 == 0)
     .Zip (list.Where((item, id) => id % 2 == 1), 
          (key, value) => new KeyValuePair<string,string>(key, value))
     .ToDictionary(p => p.Key, p => p.Value);