3

在 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 秒?

4

2 回答 2

4

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

由于这一切都在内存中,并且每个写入操作似乎都在一个单独的实例上(没有同步),您可能会并行化它以获得一些收益:

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

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


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

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

于 2013-07-17T15:54:14.337 回答
1

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

MVVM 中的一种解决方法是取消绑定数据绑定,并在完成迭代后再次绑定它们。

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

于 2013-07-23T09:41:47.137 回答