【问题标题】:Beginner C# Linq: looping through kvp in a dictionary<>初学者 C# Linq:在字典中循环遍历 kvp<>
【发布时间】:2016-04-25 22:43:15
【问题描述】:

这是

    foreach (KeyValuePair<string, int> kvp in myDic.Select(x => x).ToList())
    {

    }

还有这个

    foreach (KeyValuePair<string, int> kvp in myDic.ToList()) 
    {

    }

一样吗?

我看到了这段代码,很困惑。 “Select(x => x) 部分是否只是为了方便起见,以便以后可以变成 (x => x != 0) 之类的东西?

【问题讨论】:

  • 这是什么语言?请编辑问题以将语言添加为标签。

标签: c# linq loops dictionary key-value


【解决方案1】:

是的。这是runnable fiddle

另外,

foreach (KeyValuePair<string, int> kvp in myDic) 
{

}

也可以,因为您不需要 .ToList() 来遍历字典。

【讨论】:

    【解决方案2】:

    是的,它们产生的结果完全相同

    但是,你可以使用:

    foreach (var item in myDic)
    {
    
    }
    

    因为 Dictionary 实现了 IEnumerable,因此您可以对其进行迭代

    您编写的 2 种方法只是增加了将字典转换为另一个集合的不必要的工作

    【讨论】:

      【解决方案3】:

      Select(x =&gt; x) 并没有真正的不同。但是,ToList() 从集合中创建一个新列表。这与@NikolaiDante 在循环内修改myDic 的答案不同。

      例子:

      // working fine
      foreach (KeyValuePair<string, int> kvp in myDic.ToList())
      {
          if (kvp.Value == 0) myDic.Remove(kvp.Key);
      }
      
      // throwing exception on Remove
      foreach (KeyValuePair<string, int> kvp in myDic)
      {
          if (kvp.Value == 0) myDic.Remove(kvp.Key);
      }
      

      【讨论】:

        【解决方案4】:

        它们完全一样,因为

        Select.(x => x)
        

        只会返回初始列表。

        假设 x 是 Client 的实例,您将编写运输代码并且只需要客户地址。

        那你就去

        Select.(x => x.Address)
        

        这将返回一个List&lt;Address&gt; 而不是List&lt;Client&gt;,因此将您的方法与Client 类解耦(为什么运输会关心客户本人,它只需要地址)

        【讨论】:

          猜你喜欢
          • 2023-04-03
          • 1970-01-01
          • 2021-02-15
          • 2022-01-11
          • 2023-03-12
          • 2022-09-22
          • 2016-04-14
          • 2021-03-09
          • 1970-01-01
          相关资源
          最近更新 更多