2011-12-21 61 views
2

雖然我做了一個程序,但有時候我有這個疑問。我一直在使用List<T>,但我沒有使用其他的。有人可以告訴我List,Collection和Enumerable有什麼區別?

我想知道什麼時候每一個更好使用,以及在什麼情況下。

+6

查看文檔。 – SLaks 2011-12-21 19:21:41

+0

取決於你想要什麼也做列表泛型是創建或確保東西類型的具體名單真棒方式也是一個集合,但如果你想枚舉通的東西,你必須非常設計自己枚舉(計數器)的IEnumerable 將是一件好事..但隨後有還的foreach和for循環,它只是取決於你想要做什麼和如何快速您想要它做尼古拉斯發佈了一些偉大的鏈接來解釋它最好的.. – MethodMan 2011-12-21 19:31:20

回答

6

我確定你可以自己閱讀文檔。我在這裏給一個簡短的總結:

  1. IEnumerable是暴露在集合的枚舉的接口。如果希望能夠支持迭代,例如在foreach循環內實現此接口。
  2. CollectionIEnumerable實現(因此可以在其上進行迭代),其通常進一步由希望有收集樣行爲(即使用AddRemoveContains等)用戶定義的類延長。它也可以「按原樣」使用。
  3. List也是IEnumerable的一個實現(因此你可以遍歷它),它通常被用來作爲某種類型對象的容器。在後臺使用動態調整陣列,並且是ArrayList的通用等效項。

請注意,雖然IEnumerable既可以是通用和非通用,CollectionList只能使用泛型類。

1

列表是保持以線性方式項實例化的類型。 (編輯:我被告知它使用動態數組實現,而不是使用鏈接列表,這只是我的猜測)。

ICollection/CollectionBaseIEnumerable不是直接實例化類型。

CollectionBase/ICollection是繼承/由認爲自己是收集和保持多個項目的任何類實現的基類/接口。 CollectionBase/ICollection也允許你傳遞集合而不知道它們的實現。

IEnumerable也是一個接口,提供迭代集合的方法。 IEnumerable基本上可讓您在集合上使用foreach循環。您可以直接使用接口方法來獲取一些C++樣式迭代器,但是foreach循環不太容易出錯。

+2

名單使用動態數組,而不是鏈接列表。 – Tudor 2011-12-21 19:25:59

+1

@Digitlworld:在微軟CLR團隊的奇異世界,列表實際上沒有列出了CS的感覺:後備存儲兩個'SCG.List '和'SC.List'是,通過分配動態增長的數組和複製。 ICollection和IEnumerable完全不是類型:它們是接口。 – 2011-12-21 19:30:09

+0

在C#領域,我的理解是接口,抽象類和普通類都是'Type'類型。它們定義的基於反射的實例都是'Type'的可接受值。 – digitlworld 2011-12-21 19:32:44

0

如果你看三國的定義(見下文),你會發現List實現EnumerableICollectionICollection工具IEnumerable。更清楚的是:

ListCLASS它可以存儲可變數量的相同類型的項目加上其他兩個接口指定的功能。

ICollection是指定一個通用的方法來操縱集合的接口。注意:這是一個接口,因此不能被實例化。

IEnumerable是指定遍歷集合的裝置的接口。注意:這是一個接口,因此不能被實例化。

List

表示可通過索引訪問的對象的強類型列表。提供搜索,排序和操作列表的方法。

public class List<T> : IList<T>, ICollection<T>, 
IEnumerable<T>, IList, ICollection, IEnumerable 

ICollection

定義的方法來操作泛型集合。

public interface ICollection<T> : IEnumerable<T>, 
IEnumerable 

IEnumerable

暴露枚舉,它支持在一個指定類型的集合的簡單迭代。

public interface IEnumerable<out T> : IEnumerable 
相關問題