最有效的IEnumerable工作方式

在C#中遍历集合/ IEnumeration的最有效方法是什么。 我有一个包含近1100个对象的列表。 这些对象中的大约10个,包含1000个子对象(相同类型)。 遍历此列表需要大约5-6秒。 这是我的代码:

foreach (Parameter par in this.AllParameters) //this.AllParameters is Generic.List type { foreach (Parameter subPar in par.WrappedSubParameters) { subPar.IsSelected = false; } par.IsSelected = false; } 

有没有办法优化这段代码,以便它足够快,不需要5-6秒?

所写的循环可能是最快的选择之一。

由于这全部在内存中,并且每个写操作看起来都在一个单独的实例上(没有同步),因此您可以将其并行化以获得一些收益:

 Parallel.ForEach(this.AllParameters, par => { foreach (Parameter subPar in par.WrappedSubParameters) { subPar.IsSelected = false; } par.IsSelected = false; }); 

请注意,我只是并行化外部循环(故意),因为这应该提供足够的工作项来充分利用所有处理核心。


另一个潜在问题 – 如果您的IsSelected属性通过数据绑定绑定到控件,您的UI可能会不断更新,这可以解释非常慢的更新时间。 这将导致并行化也没有实际效果,因为瓶颈不是这些循环,而是UI绑定。

您可能希望取消绑定/重新绑定控件,或暂停控件上的更新,直到完成循环。

您编写的循环已经是最有效的迭代方法。 唯一的问题可能是绑定到用户界面元素(网格,列表等)。

MVVM中的一个解决方法是取消绑定数据绑定,并在完成操作后再绑定它们。

否则,不要设置实际属性,只需设置字段,迭代后可以通知用户界面。