2010-05-04 32 views
4

我需要一個通用的集合類,我可以添加到並枚舉。由於ICollection<T>繼承自IEnumerable<T>,該類實際上只需要從ICollection<T>繼承。 BCL中是否有一個簡單的泛型類,像CollectionBase的通用版本一樣繼承ICollection<T>?如果不是,那麼最接近什麼課程?繼承ICollection的最基本的類是什麼?<T>

我猜想List<T>這是我一直在使用,但我不需要順序方面。有什麼更好的(我的意思是[更小的內存佔用空間/更快的訪問/更簡單])?如果它存在的話,它將是完美的。

編輯1:在我的具體實例中,我將.concat轉換爲另一個IEnumerable,查詢它,然後顯示結果(不按特定順序)。我不想試着自己上課。我只需要多次做一次性收集,我認爲找到最好的一次性使用會很有用。因爲我覺得我做了很多次類似的事情,所以我覺得我應該把這個問題儘可能通用化(沒有雙關語意思),我現在知道的更好。

編輯2:感謝大家的答案,正如@BlueRaja指出,任何簡單的類都將有大約相同的開銷,所以我想我會用我原來使用List<T>的方式堅持。因爲它們都差不多,所以「打字比較容易」,「我不必再使用」等愚蠢的理由並不是那麼糟糕的原因。

+0

由於您將它與另一個枚舉串聯,所以您想要的是順序方面的聲音。 – 2010-05-04 03:23:09

回答

2

[小內存佔用/快速訪問/簡單]

他們都將有幾乎相同的內存佔用,如果你使用的ICollection接口不會改變。

真正重要的是哪個最適合您需要的操作:鏈接列表可以更好地追加/刪除(頭部/尾部元素),而基於數組的列表具有隨機訪問。還有其他結構 - 您應該使用哪個結構取決於您的應用程序。

+1

說它們都具有相同的內存佔用並不真實。鏈表將使用比基於數組的列表更多的內存。正如你注意到的那樣,它在兩端的插入和清除方面肯定表現更好。如果你已經有了LinkedListNode指針(有時不管),這也可以應用在中間。 – 2010-05-04 02:51:51

1

您可能會想要調查Collection<T>。它專爲子類的明確目的而設計,如文檔所示:

爲泛型集合提供基類。

話雖如此,任何收集都很好;我繼承了List<T>,Stack<T>等;選擇最接近你實際需要的功能的那一個。

+1

默認情況下,'Collection '使用'List '作爲後備存儲,所以它不比'List '更小/更快,但恰恰相反 - 它是一個額外的抽象層(不是它會產生可衡量的差異) 。 – 2010-05-04 01:42:14

+0

這可能有一些相關性:http://stackoverflow.com/questions/426182/what-is-the-real-advantage-of-returning-icollectiont-instead-of-a-listt-clo – 2010-05-04 01:42:59

+0

@Sam:By默認,是的,但你可以使用任何東西作爲後備商店。這就是他們介紹它的原因。所以您可以設計集合類,而無需關心自己使用的是哪種後備存儲,以避免將自己與特定的實現聯繫起來。 – Aaronaught 2010-05-04 01:44:23

1

更小更快全部取決於你在做什麼以及你的需求是什麼。我唯一可以推薦的其他課程是LinkedList<>,它實現了ICollection<>

+0

在我的特殊情況下,我將它連接到另一個IEnumerable上,查詢IEnumerable並顯示輸出。 'LinkedList <>'看起來像是比List更多的結構。 – 2010-05-04 01:47:09

+2

@Martin:「更多結構」並不意味着「更慢」或「更大的內存佔用」。即使你在每個列表中有1,000,000個項目,你仍然只有**兩個**列表,所以列表本身的內存開銷並不重要。 – 2010-05-04 01:53:57

+0

@馬丁尼爾,那些細節將有助於包括在原來的問題。 :-) – 2010-05-04 02:07:56

0

您可以使用Reflector來檢查.NET FCL並查看哪些類使用該集合。 (F3可以啓動搜索功能。)

您還可以查看C5 Library以查看是否已經實現了符合您需要的集合。查看C5 Manual的第13頁,瞭解收集界面層次結構。

0

CollectionBase主要存在以提供創建類型化集合的簡單機制。隨着泛型,所有的集合現在鍵入。在過去使用CollectionBase的擴展名的絕大多數情況下,現在應使用任何內置集合,例如List<>LinkedList<>

Collection<>對於那些需要爲類型以外的原因(即額外的添加驗證或一些非標準邏輯)提供定製集合的用戶仍然存在。 Collection<>幾乎沒有像CollectionBase那樣通常使用,並且服務於更小的需求。