初始化字典<字符串,字符串>自List

问题描述:

最简单的方法从扩展方法做到这一点,也许? :初始化字典<字符串,字符串>自List <string>

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

凡字典的条目卷起含有字符串的简单列表键和值对,交替每隔字符串是关键和价值。

+0

你要什么时候发生的关键我s'null'或两个键是否相等或列表的长度是奇数?处理这些问题将形成代码。 –

+0

在我的情况下,预计非空和独特的密钥。由于我不会尝试将这些键用作正常键,并且这只是一种简短的方法 –

的交替是一个有点疼痛。 个人我只是做了普通的:

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])抛出一个异常,如果有重复键 - 上面的代码将默默地使用最后发生的特别的关键。

+1

+1,因为它敢于赞成老式的慢速方法而不喜欢可读的代码。 – DonBoitnott

+0

'dictionary.Add(...)'而不是'dictionary [...] = ...'具有在键被复制时抛出适当异常的优点。 –

+0

@TomBlodget:真。将添加一个注释。 –

您可以使用范围是列表的长度的一半,并ToDictionary创建的,从列表项词典:

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

应该是'list.Count'。没有'list.Length'。 –

+0

@GrantWinney:当然。感谢您的发现。 – Guffa

如果你需要LINQ - 你可以先邮编名单本身:

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); 

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);