我有以下代码,它修改了 foreach
循环内集合的状态,
但是,它不会抛出任何异常。
// _topQueue.QueuedJobs is of type List<Job>
var slaJobs = _topQueue.QueuedJobs
.Where(job => job.JobInformation.SLA.HasValue)
.OrderBy(job=>job.ScheduledPriority);
foreach (var job in slaJobs) {
// Why this does not throw the exception:
// "collection was modified enumeration operation may not execute."
job.SetRunning();
job.JobInformation.StaticPriority = (int)Common.DjsConstant.PriorityPenalty;
job.ReprioritizedPriority = (int)Common.DjsConstant.PriorityBlocking;
}
另一方面,这段代码确实抛出了异常:
//_topQueue.QueuedJobs is of type List<Job>
foreach (var job in _topQueue.QueuedJobs) {
job.SetRunning();
job.JobInformation.StaticPriority = (int)Common.DjsConstant.PriorityPenalty;
job.ReprioritizedPriority = (int)Common.DjsConstant.PriorityBlocking;
}
有人知道为什么吗?
foreach
循环内具体的哪些修改会导致异常?
最佳答案
我很确定这是因为您有一个 OrderBy
,它会在给出任何结果之前枚举整个集合。因此原始集合已被完全读取,因此更改原始集合不会影响 OrderBy
已准备好的结果。
更新
防止异常的一个简单解决方案是将 .ToList()
添加到您的 linq 查询中。那么结果是一个列表,并且内部更新对象不会影响列表的内容。
// _topQueue.QueuedJobs is of type List<Job>
var slaJobs = _topQueue.QueuedJobs
.Where(job => job.JobInformation.SLA.HasValue)
.OrderBy(job=>job.ScheduledPriority)
.ToList();
foreach (var job in slaJobs) {
// etc
}
关于c# - 为什么这个 foreach 循环不抛出异常“集合被修改,枚举操作可能无法执行”。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22190419/