初学者 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 分离(为什么运输会关心客户自己, 它只需要地址)
这是
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 分离(为什么运输会关心客户自己, 它只需要地址)