2012-09-12 34 views
1

我只是看看我們的代碼庫的歷史,發現辦理入住手續從這個這種變化:這個ToArray()實現如何更優化?

public virtual T[] ToArray() 
    { 
     List<T> list = new List<T>(); 
     foreach (object item in List) 
     { 
      list.Add((T)item); 
     } 

     return list.ToArray(); 
    } 

這樣:

public virtual T[] ToArray() 
    { 
     T[] result = new T[List.Count]; 
     for (int i = 0; i < List.Count; ++i) 
     { 
      result[i] = (T)List[i]; 
     } 

     return result; 
    } 

與評論:優化ToArray的執行,以避免產生過程中有多個數據結構。

我想知道爲什麼這裏有一個優化。 for()可能比foreach()更快,但「創建多個數據結構」在哪裏?

P/S:誰寫的這是在度假

+2

我看到的最大的優化是避免使用名單,只是簡單地排列,通過了過程堅持 –

回答

9

在原代碼的傢伙,你創建一個List<T> - 由於沒有指定的容量,所以它可能涉及複製內部數組幾次 - 然後你致電List<T>,致電ToArray,產生副本。

較新的版本不這樣做。它創建一個數組,並將原始列表複製到其中。

誠然,僅僅使用LINQ的ToArray方法會更簡單,很可能更高效,這是爲什麼開始一個虛擬的方法,但...

3

第一個實現將創建一箇中間人目前還不清楚額外的List對象;它只是GC清理的一件事。這種優化幾乎肯定不會引起注意,除非這個例程在惡魔般的高級別中被擊中。

否則,它是否使用foreachfor無關。這種選擇很大程度上受列表在枚舉時無法修改的規則的驅動。

+2

這將是難於使用'foreach'同時建立一個這樣的數組,因爲你仍舊需要保持索引來知道在哪裏*寫入數組。 –