【问题标题】:How to convert List<String> to Dictionary<int,String>如何将 List<String> 转换为 Dictionary<int,String>
【发布时间】:2012-11-22 23:42:43
【问题描述】:

我有List&lt;String&gt;,我需要通过自动生成密钥将其转换为Dictionary&lt;int,String&gt;,有什么最短的方法可以实现吗?我试过了:

    var dictionary = new Dictionary<int, String>();
    int index = 0;
    list.ForEach(x=>{
      definitions.Add(index, x);
      index++;
});

但我认为这是肮脏的方式。

【问题讨论】:

    标签: c# .net linq dictionary


    【解决方案1】:
    var dict = list.Select((s, i) => new { s, i }).ToDictionary(x => x.i, x => x.s);
    

    【讨论】:

    • 这从 0 开始密钥;如果我想从任何其他数字开始,比如 10,并且还增加 10 而不是 1,该怎么办?
    • @zak 当你使用 SkipWhere 时你得到了什么?
    • 如果列表中有重复的键,我只想忽略将重复的键添加到字典中怎么办?
    • 轻微变化,使用未命名的元组 (C# 7): var dict = list.Select((s, i) => (s, i)).ToDictionary(x => xi, x => xs);
    【解决方案2】:

    用途:

    var dict = list.Select((x, i) => new {x, i})
        .ToDictionary(a => a.i, a => a.x);
    

    【讨论】:

      【解决方案3】:

      在我看来,你所拥有的比 Linq 方式更具可读性(而且,它恰好更有效):

      foreach(var item in list)
          dictionary[index++] = item;
      

      【讨论】:

      • 像这样使用赋值运算符时有一个隐藏的陷阱:dictionary[index++] = item; 现有键将被静默覆盖!当使用Add 方法时,它会抛出一个key 已经存在的异常,并且至少在运行时以某种方式通知程序员。它总是取决于用例;)像往常一样
      • @MongZhu 我不会称之为隐藏或沉默。当我们说dict[key1] = value1 时,如果key1 已经存在,则该元素将被覆盖。如果它不存在,将创建一个新元素。这就是字典通常的工作方式,它是documented。在这种情况下,字典是一个新的空实例,因此没有现有的键。
      • 我知道它已记录在案。在我的同事陷入这个陷阱之后,我们阅读了文档;)但在那之后:D“字典是一个新的空实例,所以没有现有的键”是的,这就是我的意思,具体取决于用例。在这种情况下,这是一种非常有效的方法
      • @MongZhu 你是对的,记录的东西并不总是意味着它是显而易见的。我想我们将把文档链接留在这里(上面),希望它可以帮助其他人:)
      【解决方案4】:

      我觉得这是最整洁的

      int index = 0;
      var dictionary = myList.ToDictionary(item => index++);
      

      【讨论】:

      • 男孩,这比公认的答案要简单得多 - 为什么要让它变得如此复杂,只是为了将它放在一行中?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多