集合已修改;枚举操作可能无法执行

本文关键字:执行 操作 修改 枚举 集合 | 更新日期: 2023-09-27 18:29:21

我们最近收到了这个错误,不知道为什么,我们没有修改任何集合,我们甚至删除了收到错误的页面上的大部分foreach。以下是错误的堆栈:

   Exception type: InvalidOperationException 
    Exception message: Collection was modified; enumeration operation may not execute.
   en System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   en System.Linq.Enumerable.WhereListIterator`1.MoveNext()
   en System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
   en System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   en System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
   en System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   en System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext()
   en System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   en System.Linq.Enumerable.<ReverseIterator>d__a0`1.MoveNext()
   en System.Web.Mvc.FilterProviderCollection.<RemoveDuplicates>d__b.MoveNext()
   en System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   en System.Linq.Enumerable.<ReverseIterator>d__a0`1.MoveNext()
   en System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   en System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   en System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   en System.Web.Mvc.FilterInfo..ctor(IEnumerable`1 filters)
   en System.Web.Mvc.ControllerActionInvoker.GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
   en System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
   en System.Web.Mvc.Controller.ExecuteCore()
   en System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
   en System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
   en System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
   en System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d()
   en System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   en System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

感谢您的帮助。

集合已修改;枚举操作可能无法执行

我也看到这个问题突然出现,所以我做了一些挖掘。很明显,这种情况发生在基于堆栈跟踪的MVC内部,但看起来MVC 5应该解决这个问题。左边的版本是MVC4,右边的版本是发布时MVC5的当前版本。如果您检查RemoveDuplicates()方法,它看起来已经被修改以防止出现异常,就像我们看到的那样。

列表实例化的更多代码会有所帮助。

实际上,我会检查您传递给列表构造函数的枚举值是否没有更改。当您使用IEnumerable时,您将在该点生成可枚举对象,而IQueryable允许您将可枚举对象的生成推迟到执行的控制点。

对我来说,看起来你正在生成一个传递给列表构造函数的IEnumerable To,但你在修改之前修改了源列表。