gpt4 book ai didi

c# - 使用 Linq 生成要从另一个集合中删除的事物的集合

转载 作者:太空狗 更新时间:2023-10-30 00:28:58 26 4
gpt4 key购买 nike

我熟悉在使用 foreach 遍历集合时修改集合的问题。循环(即“System.InvalidOperationException:集合已修改”)。但是,当我使用 Linq 创建要从字典中删除的键列表,然后遍历我的新列表时,我遇到了同样的异常,这对我来说没有意义。

之前的代码,抛出异常:

IEnumerable<Guid> keysToDelete = _outConnections.Where(
pair => pair.Value < timeoutPoint
).Select(pair => pair.Key);

foreach (Guid key in keysToDelete)
{
...some stuff not dealing with keysToDelete...
_outConnections.Remove(key);
}

之后的代码,有效:

List<Guid> keysToDelete = _outConnections.Where(
pair => pair.Value < timeoutPoint
).Select(pair => pair.Key).ToList();

for (int i=keysToDelete.Count-1; i>=0; i--)
{
Guid key = keysToDelete[i];
...some stuff not dealing with keysToDelete...
_outConnections.Remove(key);
}

这是为什么?我有一种感觉,也许我的 Linq 查询并没有真正返回一个新集合,而是原始集合的某个子集,因此它指责我修改集合 keysToDelete当我从 _outConnections 中删除一个元素时.

更新:以下修复也有效,感谢 Adam Robinson:

List<Guid> keysToDelete = _outConnections.Where(
pair => pair.Value < timeoutPoint
).Select(pair => pair.Key).ToList();

foreach (Guid key in keysToDelete)
{
...some stuff not dealing with keysToDelete...
_outConnections.Remove(key);
}

最佳答案

你是对的。 LINQ 使用所谓的“延迟执行”。声明 LINQ 查询实际上并没有做任何事情,除了构造一个查询表达式。直到您实际枚举列表时才会评估查询,并且它使用原始列表作为源。

但是,调用 ToList() 应该会创建一个与原始列表无关的全新列表。检查异常的调用堆栈以确保它实际上是由 keysToDelete 抛出的。

关于c# - 使用 Linq 生成要从另一个集合中删除的事物的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1544390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com