【问题标题】:Initialize Dictionary<string,string> from List<string>从 List<string> 初始化 Dictionary<string,string>
【发布时间】:2014-01-07 02:40:04
【问题描述】:

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

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

字典中的条目包含来自简单字符串列表的键和值对,交替每个其他字符串作为键和值。

【问题讨论】:

  • 当一个键是null 或者两个键相等或者列表的长度是奇数时,你想发生什么?处理这些问题将塑造代码。
  • 在我的情况下,它需要非空和唯一的键。由于我通常不会尝试将它们用作键,这只是一种速记方法

标签: c# generics dictionary extension-methods


【解决方案1】:

这种交替有点痛苦。 个人我会直接做:

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 表示敢于使用老式的手写方法而不是可爱但可读性较差的代码。
  • dictionary.Add(...) 而不是 dictionary[...] = ... 的优点是在键重复时会引发适当的异常。
  • @TomBlodget:是的。将添加注释。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-29
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        相关资源
        最近更新 更多