Dot-Net

List (of T) 和 Collection(of T) 有什麼區別?

  • December 29, 2008

我已經看到它們以許多相同的方式使用,我擔心如果我不能更好地理解這一點,我將走上一條不可逆轉的設計之路。另外,我正在使用.NET。

Collection<T>是一個可定制的包裝器IList<T>。雖然IList<T>沒有密封,但它不提供任何自定義點。Collection<T>的方法預設委託給標準IList<T>方法,但可以很容易地重寫以執行您想要的操作。也可以在一個Collection<T>我不相信可以用 IList 完成的事件中連接事件。

簡而言之,事後擴展它要容易得多,這可能意味著更少的重構。

在 C# 中,表示一袋對像有三個概念。按功能遞增的順序,它們是:

  • 可枚舉- 無序、不可修改
  • 收藏- 可以添加/刪除項目
  • 列表- 允許項目有順序(按索引訪問和刪除)

可枚舉沒有順序。您不能在集合中添加或刪除項目。您甚至無法計算集合中的項目數。它嚴格允許您一個接一個地訪問集合中的每個項目。

集合是一個可修改的集合。您可以從集合中添加和刪除對象,還可以獲取集合中項目的計數。但是仍然沒有順序,因為沒有順序:無法通過索引訪問項目,也沒有任何排序的方法。

List是一組有序的對象。您可以對列表進行排序、按索引訪問項目、按索引刪除項目。

事實上,在查看這些介面時,它們是相互建構的:

  • interface IEnumerable<T>

    • GetEnumeration<T>
  • interface ICollection<T> : IEnumerable<T>

    • Add
    • Remove
    • Clear
    • Count
  • interface IList<T> : ICollection<T>

    • Insert
    • IndexOf
    • RemoveAt

聲明變數或方法參數時,應選擇使用

  • IEnumerable
  • ICollection
  • 列表

基於您在概念上需要對一組對象執行的操作。

如果您只需要能夠對列表中的每個對象執行某些操作,那麼您只需要IEnumerable

void SaveEveryUser(IEnumerable<User> users)
{
   for User u in users
     ...
}

您不在乎使用者是否保存在List<T>,Collection<T>Array<T>其他任何內容中。你只需要IEnumerable<T>介面。

如果您需要能夠添加、刪除或計算集合中的項目,請使用Collection

ICollection<User> users = new Collection<User>();
users.Add(new User());

如果您關心排序順序,並且需要正確的順序,請使用List

IList<User> users = FetchUsers(db);

圖表形式:

| Feature                | IEnumerable<T> | ICollection<T> | IList<T> |
|------------------------|----------------|----------------|----------|
| Enumerating items      | X              | X              | X        |
|                        |                |                |          |
| Adding items           |                | X              | X        |
| Removing items         |                | X              | X        |
| Count of items         |                | X              | X        |
|                        |                |                |          |
| Accessing by index     |                |                | X        |
| Removing by index      |                |                | X        |
| Getting index of item  |                |                | X        |

List<T>Collection<T>inSystem.Collections.Generic是實現這些介面的兩個類;但它們不是唯一的類:

因此,您可以輕鬆更改:

IEnumerable<User> users = new SynchronizedCollection<User>();

SaveEveryUser(users);

tl;博士

  • 可枚舉- 訪問項目,無序,不可修改
  • 集合- 可以修改(添加、刪除、計數)
  • 列表- 可以按索引訪問

選擇你需要的概念,然後使用匹配的類。

引用自:https://stackoverflow.com/questions/398903