2013-07-17 36 views
3

在C#中遍歷集合/ IEnumeration的最有效方法是什麼?我有一個包含近1100個對象的列表。這些對象中的近10個,包含1000個子對象(相同類型)。遍歷此列表需要將近5-6秒。這裏是我的代碼:使用IEnumerable的最高效方式

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

+5

我建議你先在代碼上運行[profiler](http://stackoverflow.com/q/3927/87698)。在'AllParameters'屬性,'WrappedSubParameters'屬性,'IsSelected'設置器,其中一個枚舉器等中,時間可能會丟失。(哦,如果有時間的話,Eric Lippert的[關於公共基準測試的系列錯誤](http://tech.pro/blog/1293/c-performance-benchmark-mistakes-part-one)值得一讀。) – Heinzi

+0

我不會指望大約一百萬寫這樣的,採取5 -6秒。你在調試版本中計時嗎?在VS之外的發行版本中,我認爲這比大多數系統快一點,除非發生其他事情,例如IsSelected數據綁定等。 –

+0

是@ReedCopsey,IsSelected已綁定DataGrid的選擇屬性。這可能是時間循環的原因嗎? – Irfan

回答

4

所寫的循環可能是最快的選項之一。

因爲這是所有在內存中,並且每次寫操作似乎是在一個單獨的實例(沒有同步),你可能並行這得到一些收穫:

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

請注意,我只是很並行化外部循環(有意),因爲這應該提供足夠的工作項目以充分使用所有處理核心。


另一個潛在的問題 - 如果你IsSelected屬性通過數據綁定到控件綁定,用戶界面將有可能是不斷更新,這可以解釋的很慢的更新時間。這會導致並行化也沒有實際效果,因爲瓶頸不會是這些循環,而是UI綁定。

您可能想要取消綁定/重新綁定控件,或掛起控件上的更新,直到完成循環。

+0

我已經試過這個解決方案,但在我的情況下,它沒有添加任何區別。我正在使用帶有Windows 7的x64計算機 – Irfan

+0

現在再次,爲了實驗的目的,我再次嘗試了這段代碼,並且不知何故,我的程序進入了非響應狀態:( – Irfan

+1

@Irfan我認爲數據綁定是問題。你正在使用WPF,WinForms,Windows Store應用程序等? –

1

您編寫的循環已經是最有效的迭代方法。唯一的問題可能是綁定到用戶界面元素(網格,列表等)。

MVVM中的一種解決方法是解除綁定數據綁定,並在完成篡改後再綁定它們。

否則,請不要設置實際屬性,只需設置字段,並且在迭代後可以通知用戶界面。