c# - 为什么这个 foreach 循环不抛出异常“集合被修改,枚举操作可能无法执行”。

标签 c# collections foreach ienumerable

我有以下代码,它修改了 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/

相关文章:

javascript - 具有嵌套 forEach 和 for 循环的函数不会返回 false

PHP 分层数组 - 检查子值是否存在,然后将父属性值分配给其子数组

c# - 如何为一组对象生成独立于顺序的唯一哈希

java - "infinite"迭代器的设计是否糟糕?

c# - LambdaExpression CompileToMethod

C# 嵌套 null 检查 if 语句

java - 根据对象属性将 java 集合拆分为子集合

php - foreach函数从mysql db创建数组

c# - 在链表 C#.NET 中移动项目

c# - 获取任务的方法名