我有一个清单。有必要遍历其所有元素,在每次迭代中调用计算函数,并在某些条件下从循环中删除元素并继续迭代。
一开始我想for,如果我们删除它,做i--,因为 元素的数量减少了 1,但这不能通过并行运行来完成,所以我认为在 foreach 中这样做,以免与元素索引绑定。但是在改变foreach的时候,会抛出异常,这是合乎逻辑的。
是否有可能以某种方式通过循环并行运行,并通过条件(如果有的话)删除元素。这样它就不会影响并行流中的其他元素?
我有一个清单。有必要遍历其所有元素,在每次迭代中调用计算函数,并在某些条件下从循环中删除元素并继续迭代。
一开始我想for,如果我们删除它,做i--,因为 元素的数量减少了 1,但这不能通过并行运行来完成,所以我认为在 foreach 中这样做,以免与元素索引绑定。但是在改变foreach的时候,会抛出异常,这是合乎逻辑的。
是否有可能以某种方式通过循环并行运行,并通过条件(如果有的话)删除元素。这样它就不会影响并行流中的其他元素?
如果您不需要立即从集合中删除元素,请创建另一个(线程安全的)集合,将要删除的元素添加到其中,在第一个循环完成后,只需删除其中存在的所有元素第一个集合中的第二个:
如果对于您的任务而言,从输入集合中删除元素并不重要,但形成新集合的选项也适合,您可以使用 Parallel Linq 功能:
如果列表完全正确
List<Smth>,则使用常规循环for。我提请您注意这样一个事实,即删除多个元素
Remove是低效的,因为它会导致二次渐近(尾部一直在移动)。正确的选择是使用RemoveAll. 好吧,要么在检查时通过手动结束移位编写一个列表处理。