List (of T) 和 Collection(of T) 有什麼區別?
我已經看到它們以許多相同的方式使用,我擔心如果我不能更好地理解這一點,我將走上一條不可逆轉的設計之路。另外,我正在使用.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>
AddRemoveClearCount
interface IList<T> : ICollection<T>
InsertIndexOfRemoveAt聲明變數或方法參數時,應選擇使用
- 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是實現這些介面的兩個類;但它們不是唯一的類:
ConcurrentBag<T>是一個有序的對象包 (IEnumerable<T>)LinkedList<T>是一個包,您不允許通過索引 (ICollection) 訪問項目;但您可以在集合中任意添加和刪除項目SynchronizedCollection<T>是一個有序集合,您可以在其中按索引添加/刪除項目因此,您可以輕鬆更改:
IEnumerable<User> users = new SynchronizedCollection<User>(); SaveEveryUser(users);tl;博士
- 可枚舉- 訪問項目,無序,不可修改
- 集合- 可以修改(添加、刪除、計數)
- 列表- 可以按索引訪問
選擇你需要的概念,然後使用匹配的類。