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

本文关键字:遍历 循环 kvp 字典 Linq 初学者 | 更新日期: 2023-09-27 18:31:16

>这是吗

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

而这个

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

一样?

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

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

它们完全相同,因为

Select.(x => x)

将只返回初始列表。

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

然后你会去

Select.(x => x.Address)

这将返回一个List<Address>而不是List<Client>因此将您的方法与Client类分离(为什么 shipping 会关心客户本身,它只需要地址)

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

是的。这是一个可运行的小提琴。

此外

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

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

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

但是,您可以使用:

foreach (var item in myDic)
{
}

因为字典实现了IEnumerable,因此您可以迭代它

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