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

5

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

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

当字典包含键和值对的条目时,这些键和值对来自简单字符串列表,每隔一个字符串交替出现作为键和值。


当一个键为null或两个键相等或列表长度为奇数时,您希望发生什么?处理这些问题将塑造代码。 - Tom Blodget
在我的情况下,它期望非空且唯一的键。由于我通常不会尝试将它们用作键,而这只是一种简写方法。 - Brady Moritz
4个回答

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])来抛出异常,如果存在重复的键 - 上述代码将默默地使用特定键的最后一次出现。


1
敢于支持老派的手写方法,而不是可爱但不易读的代码,这点我给你点赞。 - DonBoitnott
使用dictionary.Add(...)而不是dictionary[...] = ...的优点在于当键重复时抛出适当的异常。 - Tom Blodget
@TomBlodget:没错,我会添加一条注释。 - Jon Skeet

3

您可以使用列表长度的一半作为范围,并使用 ToDictionary 从列表中的项创建字典:

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

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

1
如果您需要使用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);

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