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

时间:2016-01-20 07:36:44

标签: c# linq loops dictionary key-value

这是

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

    }

和这个

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

    }
同样的?

我看到这段代码并感到困惑。为方便起见,“选择(x =&gt; x)部分是否就在那里,以便以后可以变成类似(x =&gt; x!= 0)的东西?

4 个答案:

答案 0 :(得分:2)

它们完全相同,因为

Select.(x => x)

只返回初始列表。

想象一下x是Client的实例,您将编写货运代码并且只需要客户地址。

然后你会选择

Select.(x => x.Address)

会返回List<Address>而不是List<Client>因此将您的方法与Client类解耦(为什么会关心客户端本身,只需要地址)

答案 1 :(得分:1)

是。这是一个runnable fiddle

此外,

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

}

也可以,因为你不需要.ToList()来迭代字典。

答案 2 :(得分:1)

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

但是,你可以使用:

foreach (var item in myDic)
{

}

因为Dictionary实现了IEnumerable,因此你可以迭代它

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

答案 3 :(得分:1)

Select(x => x)并没有真正有所作为。但是,ToList()会从集合中创建一个新列表。这与在循环内修改myDic的情况下的@NikolaiDante答案不同。

示例:

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