2010-03-30 71 views
5

考慮下面的代碼:效率:增量創建一個雙精度數組?

List<double> l = new List<double>(); 

//add unknown number of values to the list 
l.Add(0.1); //assume we don't have these values ahead of time. 
l.Add(0.11); 
l.Add(0.1); 

l.ToArray(); //ultimately we want an array of doubles 

什麼不對這種方法?有沒有更適當的方法來建立一個數組,而不知道大小或元素提前?

回答

8

沒有什麼錯你的方法。您正在使用正確的數據類型。

+0

我知道這個問題很老,我可能對此有錯,但在我看來,OP正在詢問關於'l.ToArray();'語句,因爲我也想知道它。如果它必須創建一個全新的數據結構,然後複製所有數據並銷燬原始數據,這實際上並不是那麼高效。返回'List '或任何其他不需要複製和轉換的數據類型會更有效率。 – 2011-02-23 05:34:03

-1

動態數據結構像一個列表是實現這個正確的方法。與列表中唯一真正的優勢數組相比,O(1)訪問性能(與O(n)相比)。靈活性超過了恕我直言,

+4

列表是O(1)來訪問 - 在內部,它是一個大小動態增長的數組。 – 2010-03-30 08:27:51

+1

列表<>不是鏈表。 – ima 2010-03-30 08:29:08

+0

我的立場正確和受過教育! – 2010-03-30 08:45:00

3

這種性能損失一些意見後,你可以在該列表中共有元素的一個更好的想法彌補。然後,您可以在構造函數中創建一個具有初始容量的新列表:

List<double> l = new List<double>(capacity); 

除此之外,它是正確的技術和數據結構。


UPDATE

如果您:

  • 只需要List<T>結構的AddToArray功能,
  • 你不能真正預測的總容量
  • 你結束了1K多元素
  • 和更好的性能是真的(真的!)你的目標

那麼你可能想編寫自己的接口:

public interface IArrayBuilder<T> 
{ 
    void Add(T item); 
    T[] ToArray(); 
} 

,然後寫自己的實現,這可能是優於List<T>。這是爲什麼?因爲List<T>內部保存了一個數組,並且在需要時增加了它的大小。在性能方面增加內部數組成本的過程,因爲它分配新的內存(也許可以將舊數組中的元素複製到新數組中,我不記得)。但是,如果上述所有條件都是真實的,那麼您只需構建一個數組,您並不需要在內部將所有數據存儲在單個數組中。

我知道這是一個長鏡頭,但我認爲這是更好地分享這樣的想法......

0

正如其他人已經指出:這是正確的做法。我只補充一點,如果你能以某種方式避免陣列,並直接或者也許IEnumerable<T>使用List<T>,你會避免複製數組ToArray實際副本列表實例的內部數組。

埃裏克利珀有很大post about arrays,使你可以找到相關的。