初学者 C# Linq:在字典 <> 中循环遍历 kvp

Beginner C# Linq: looping through kvp in a dictionary<>

这是

    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) 的东西?

是的。这是 runnable fiddle.

此外,

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

}

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

是的,它们产生的结果完全一样

但是,您可以只使用:

foreach (var item in myDic)
{

}

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

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

Select(x => 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);
}

它们完全一样,因为

Select.(x => x)

将只是 return 初始列表。

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

然后你会选择

Select.(x => x.Address)

return 一个 List<Address> 而不是 List<Client> 因此将你的方法与 Client class 分离(为什么运输会关心客户自己, 它只需要地址)