Sar*_*els 4 c# linq collections loops
我熟悉修改集合的问题,同时用循环遍历它foreach(即"System.InvalidOperationException:Collection was modified").但是,当我使用Linq创建要从字典中删除的键列表,然后遍历我的新List时,我得到相同的异常对我没有意义.
之前的代码,抛出异常:
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);
}
Run Code Online (Sandbox Code Playgroud)
代码之后,工作:
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);
}
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我觉得可能我的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);
}
Run Code Online (Sandbox Code Playgroud)
你说的没错.LINQ使用所谓的"延迟执行".除了构造查询表达式之外,声明LINQ查询实际上不会执行任何操作.直到您实际枚举列表中的查询被评估,并且它使用原始列表作为源.
但是,调用ToList()应创建一个与原始列表无关的全新列表.检查异常的调用堆栈以确保它实际被抛出keysToDelete.
| 归档时间: |
|
| 查看次数: |
896 次 |
| 最近记录: |