![]() |
1
1616
到
打电话
|
![]() |
2
113
有几种方法可以解决这个问题,其中一种方法是将for循环更改为使用显式
|
![]() |
3
64
在我看来,一个更有效的方法是有另一个清单,你声明你把任何“要删除”的东西都放进去。然后在完成主循环(不带.to list())之后,在“要删除”列表上执行另一个循环,在发生时删除每个条目。所以在你的课上你要加上:
这不仅可以解决你的问题,还可以防止你不断地从字典中创建一个列表,如果有很多订阅者的话,这个列表会很昂贵。假设在任何给定的迭代中要删除的订阅服务器列表低于列表中的总数,则速度应该更快。当然,如果您对您的具体使用情况有任何疑问,请随时对其进行描述以确保其正确性。 |
![]() |
4
42
您还可以锁定订阅者词典,以防止在循环时对其进行修改:
|
![]() |
5
28
为什么会出现这个错误?通常.Net集合不支持同时枚举和修改。如果在枚举期间尝试修改集合列表,则会引发异常。因此,这个错误背后的问题是,我们不能在遍历列表/字典时对其进行修改。 解决方案之一如果我们使用dictionary的键列表来迭代dictionary,那么我们可以并行地修改dictionary对象,因为我们正在迭代key集合,并且 不是字典(并迭代它的密钥集合)。 例子
这是一个 blog post |
![]() |
6
5
实际上,在我看来,问题是您正在从列表中删除元素,并希望继续读取列表,就像什么都没发生过一样。
|
![]() |
7
4
无效操作异常- 发生InvalidOperationException。它报告foreach循环中的“collection was modified” 删除对象后,使用break语句。
|
![]() |
8
3
我有同样的问题,当我使用
|
![]() |
9
3
好吧,所以帮助我的是反向迭代。我试图从列表中删除一个条目,但向上迭代,结果它弄糟了循环,因为该条目已不存在:
|
![]() |
10
2
我见过很多选择,但对我来说这是最好的。
请注意,ListItemCollection可以包含重复项。默认情况下,没有任何内容阻止将重复项添加到集合中。要避免重复,可以执行以下操作:
|
![]() |
11
1
接受的答案在最坏的情况下是不精确和不正确的。
通常,不可变类型意味着一旦创建就不能更改其状态。 所以你的代码应该是:
如果您有一个公共成员,这可能特别有用。其他类总是可以
|
![]() |
12
0
可以将订阅服务器字典对象复制到同一类型的临时字典对象,然后使用foreach循环迭代临时字典对象。 |
![]() |
13
0
因此,解决这个问题的另一种方法是创建一个新字典,只添加不想删除的元素,然后用新字典替换原来的字典。我不认为这是一个太多的效率问题,因为它不会增加您在结构上迭代的次数。 |
![]() |
14
0
给定的解决方案是可以的,然后像帖子一样,其他人可以尝试这些解决方案。 供您参考原始链接:- https://bensonxion.wordpress.com/2012/05/07/serializing-an-ienumerable-produces-collection-was-modified-enumeration-operation-may-not-execute/ 当我们使用.Net序列化类序列化其定义包含可枚举类型的对象时,即。 集合,您将很容易得到invalidooperationexception,说“集合被修改了; 最根本的原因是序列化类将通过枚举器在集合中迭代,因此, 第一个解决方案,我们可以简单地使用锁作为同步解决方案来确保 对列表对象的操作一次只能从一个线程执行。 如果要序列化该对象的集合,则将对每个对象应用锁。 好吧,.Net 4.0这使得处理多线程场景变得非常方便。 对于这个序列化集合字段的问题,我发现我们可以从ConcurrentQueue(Check MSDN)类中获益, 这是一个线程安全和FIFO集合,使代码无锁。 使用这个类,简单地说,代码需要修改的内容是用它替换集合类型, 使用Enqueue将元素添加到ConcurrentQueue的末尾,删除这些锁代码。 或者,如果您正在处理的场景确实需要像List这样的集合,那么您将需要更多的代码来将ConcurrentQueue调整到您的字段中。 顺便说一句,ConcurrentQueue没有Clear方法,因为底层算法不允许原子清除集合。 所以你必须自己做,最快的方法是重新创建一个新的空ConcurrentQueue来替换它。 |
![]() |
15
0
下面是一个需要专门方法的特定场景:
更新:
|
![]() |
16
-1
我个人最近在一个不熟悉的代码中遇到了这个问题,它位于一个带有Linq.Remove(item)的开放dbcontext中。我花了很长时间查找错误调试,因为第一次迭代时项被删除,如果我试图后退一步并重新跳过,则集合为空,因为我处于同一上下文中! |
![]() |
Drago · Linq通过比较Id和具有Id的对象列表来查询获取列表 3 年前 |
![]() |
Niyazi Babayev · 如何在表达式中动态应用表达式? 3 年前 |
![]() |
Murat Güzel · EF存储库模式错误{'Id'}已被跟踪 3 年前 |
![]() |
dotnetdevcsharp · 减少基于数据类型获取设置的方法数量 3 年前 |
![]() |
saravanan049 · 在实体框架中回滚Azure SQL数据库 3 年前 |