C# 使用IEnumerable最有效的方法

C# 使用IEnumerable最有效的方法,c#,list,optimization,C#,List,Optimization,在C#中遍历集合/IEnumeration最有效的方法是什么。我有一个包含将近1100个对象的列表。在这些对象中,inturn几乎有10个包含1000个子对象(相同类型)。遍历此列表几乎需要5-6秒。这是我的密码: foreach (Parameter par in this.AllParameters) //this.AllParameters is Generic.List type { foreach (Parameter subPar in par.WrappedSubParam

在C#中遍历集合/IEnumeration最有效的方法是什么。我有一个包含将近1100个对象的列表。在这些对象中,inturn几乎有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中的一个解决方法是解除数据绑定,在完成itrating后,再次绑定它们


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

我建议您首先运行代码。时间可能会在
AllParameters
属性、
WrappedSubParameters
属性、
IsSelected
setter、一个枚举数等中丢失(哦,如果你有时间,Eric Lippert的值得一读)。我不希望像这样大约100万次写操作需要5-6秒。您是否正在调试构建中计时?在VS之外的版本构建中,我希望这比大多数系统上的要快一点,除非发生其他事情,例如
IsSelected
被数据绑定,等等。是@ReedCopsey,IsSelected与DataGrid的selection属性绑定。这可能是花时间循环的原因吗?@Irfan是的-数据绑定会减慢速度。您可能需要将大量更改通知网格,例如
BeginUpdate
或诸如此类的内容,以使网格不受所有次要更新的影响,并在最后进行完整更新。很多网格都有这样的功能,但对DataGrid并不确定。我已经尝试过这个解决方案,但在我的情况下,它并没有增加任何区别。我在Windows 7上使用x64计算机,为了实验起见,我再次尝试了此代码,不知何故,我的程序进入无响应状态:(@Irfan我认为数据绑定是个问题。你在使用WPF、WinForms、Windows应用商店应用程序等吗?@Irfan:很可能它进入无响应状态,因为并行代码正试图从线程池线程修改UI控件。这将是个问题。在不使用并行内容的情况下执行此操作,并且,正如Lasse V.Karlsen在评论中建议的那样,在开始更新之前,先挂起控件上的布局。谢谢…所以我现在将提出另一个关于在我的情况下挂起布局的问题!