2010-07-11 50 views
5

目前我使用的是List<short>作爲緩衝來裝東西了一段時間,而計算是基於其他值進一步下跌的緩衝,以每個值進行。然後我意識到,這可能不是非常有效,因爲我被告知List<>是一個鏈表,所以每次我做whatever = myList[100];時,可憐的東西首先跳下所有其他節點,以達到我想要的值。我不想使用常規數組,因爲我在代碼中的其他地方加載了Add()Remove()。所以我需要一個繼承IList<T>的類,但使用常規數組數據結構。有沒有人知道.net中的一個類以這種方式工作,所以我不必寫我自己的?我嘗試使用ArrayList,但它不是通用的!列表數據結構C#效率

+3

老實說,我認爲你不會過分強調效率。你得到的任何收益都將幾乎不明顯 – lomaxx 2010-07-11 16:21:26

+1

'List <>'不是鏈表。 'LinkedList <>'然而。你可能已經注意到了,因爲在鏈表中公開隨機訪問是沒有意義的。 – Dykam 2010-07-11 16:24:49

+0

對列表進行索引訪問是O(1)操作。 – digEmAll 2010-07-11 16:26:28

回答

1

不,List<T>是一個通用的集合,而不是鏈接列表。如果你需要添加和刪除功能,那麼List<T>是大多數人默認使用的實現。

+0

好的,謝謝我的想法,一個List <>是一個鏈表是錯誤的:( – 2010-07-11 16:24:01

+0

如果多數民衆贊成的情況下是沒有任何理由的使用規則陣列在名單? – 2010-07-11 16:26:03

+0

爲了簡單,當你只處理一個固定?數量及對象的集合 – thecoop 2010-07-11 17:07:35

8

List<T>不使用鏈表實現。它在內部使用一個數組,所以它看起來正是你所需要的。請注意,因爲它是一個數組,刪除/插入可能是一個昂貴的操作,具體取決於列表的大小以及要刪除/插入的位置項 - O(n)。儘管不知道如何使用它,但很難推薦更好的數據結構。

docs的備註部分引用。

List(T)類是ArrayList類的通用等價物。它使用大小根據需要動態增加的數組實現IList(T)泛型接口。

2

List<T>由數組,而不是一個鏈表支持。索引訪問的List<T>發生在不變的時間。

2

除了tvanfosson的正確答案,如果您不確定內部是如何工作的,只需加載.NET Reflector,您就可以看到如何實施。在這種情況下,向下鑽取到的List<T>索引向我們展示了下面的代碼:

public T this[int index] 
{ 
    get 
    { 
     if (index >= this._size) 
     { 
      ThrowHelper.ThrowArgumentOutOfRangeException(); 
     } 
     return this._items[index]; 
    } 
    // ... 

在這裏你可以看到this._items[index]是通用型T的數組。

+1

因爲Reflector不再免費,所以[ILSpy](http://ilspy.net/)和[DotPeek](http://www.jetbrains.com/decompiler/)是其他免費選擇。 – 2013-05-23 19:07:14