選取集合類別
請務必謹慎選擇您的集合類別。 使用錯誤的類型可能會限制您使用集合。
重要
避免在 System.Collections 命名空間中使用那些型別。 由於泛型和並行版本的集合類型較安全,而且提供其他增強功能,因此建議使用這些版本。
請考量下列問題:
您是否需要循序清單,其中的項目通常會在擷取其值之後捨棄?
如果是,並且需要先進先出 (FIFO) 行為,請考慮使用 Queue 類別或 Queue<T> 泛型類別。 如果需要後進先出 (LIFO) 行為,請考慮使用 Stack 類別或 Stack<T> 泛型類別。 若要從多個執行緒進行安全存取,請使用並行版本 ConcurrentQueue<T> 和 ConcurrentStack<T>。 若要確保不變性,請考慮不可變的版本 ImmutableQueue<T> 和 ImmutableStack<T>。
如果否,請考慮使用其他集合。
您是否需要以特定順序 (例如 FIFO、LIFO 或隨機) 存取項目?
類別 Queue 以及 Queue<T>、ConcurrentQueue<T> 和 ImmutableQueue<T> 泛型類別都提供 FIFO 存取。 如需詳細資訊,請參閱使用安全執行緒集合的時機。
類別 Stack 以及 Stack<T>、ConcurrentStack<T> 和 ImmutableStack<T> 泛型類別都提供 LIFO 存取。 如需詳細資訊,請參閱使用安全執行緒集合的時機。
LinkedList<T> 泛型類別允許從頭到尾或從尾到頭進行循序存取。
您是否需要依索引存取每個項目?
ArrayList 和 StringCollection 類別以及 List<T> 泛型類別,可依項目之以零為起始的索引來存取其項目。 若要確保不變性,請考慮不可變的泛型版本 ImmutableArray<T> 和 ImmutableList<T>。
Hashtable、SortedList、ListDictionary 和 StringDictionary 類別以及 Dictionary<TKey,TValue> 和 SortedDictionary<TKey,TValue> 泛型類別,可依項目的索引鍵來存取其項目。 此外,有數個對應類型的不可變版本:ImmutableHashSet<T>、ImmutableDictionary<TKey,TValue>、ImmutableSortedSet<T> 和 ImmutableSortedDictionary<TKey,TValue>。
NameObjectCollectionBase 和 NameValueCollection 類別以及 KeyedCollection<TKey,TItem> 和 SortedList<TKey,TValue> 泛型類別,可依項目之以零為起始的索引或索引鍵來存取其項目。
每個項目會包含一個值、一個索引鍵和一個值的組合,還是一個索引鍵和多個值的組合?
一個值:根據 IList 介面或 IList<T> 泛型介面來使用任何集合。 針對不可變的選項,請考慮 IImmutableList<T> 泛型介面。
一個索引鍵和一個值:根據 IDictionary 介面或 IDictionary<TKey,TValue> 泛型介面來使用任何集合。 針對不可變的選項,請考慮 IImmutableSet<T> 或 IImmutableDictionary<TKey,TValue> 泛型介面。
一個具有內嵌索引鍵的值:使用 KeyedCollection<TKey,TItem> 泛型類別。
一個索引鍵和多個值:使用 NameValueCollection 類別。
您是否需要使用與輸入項目不同的順序來排序項目?
Hashtable 類別會依其雜湊碼來排序其項目。
SortedList 類別,而 SortedList<TKey,TValue> 與 SortedDictionary<TKey,TValue> 泛型類別會依該索引鍵排序其元素。 排序次序是以 SortedList 類別的 IComparer 介面實作和 SortedList<TKey,TValue> 與 SortedDictionary<TKey,TValue> 泛型類別的 IComparer<T> 泛型介面實作為基礎。 在兩個泛型型別中,SortedDictionary<TKey,TValue> 提供比 SortedList<TKey,TValue> 更好的效能,而 SortedList<TKey,TValue> 會取用較少的記憶體。
ArrayList 提供 Sort 方法,這個方法接受 IComparer 實作做為參數。 其對應的泛型版本 (List<T> 泛型類別) 會提供 Sort 方法,這個方法接受 IComparer<T> 泛型介面的實作做為參數。
您是否需要快速搜尋和擷取資訊?
- 若為小型集合 (10 個項目或更少),ListDictionary 的速度比 Hashtable 更快。 Dictionary<TKey,TValue> 泛型類別提供比 SortedDictionary<TKey,TValue> 泛型類別更快的查閱速度。 多執行緒實作是 ConcurrentDictionary<TKey,TValue>。 ConcurrentBag<T> 會針對未排序的資料提供快速的多執行緒插入。 如需多執行緒型別的詳細資訊,請參閱使用安全執行緒集合的時機。
您是否需要只接受字串的集合?
StringCollection (以 IList 為基礎) 和 StringDictionary (以 IDictionary 為基礎) 位於 System.Collections.Specialized 命名空間中。
此外,您可以使用 System.Collections.Generic 命名空間中的任何泛型集合類別做為強類型字串集合,方法是指定其泛型類型引數的 String 類別。 例如,您可以將變數的型別宣告為 List<String> 或 Dictionary<String,String>。
LINQ to Objects 和 PLINQ
只要物件類型實作 IEnumerable 或 IEnumerable<T>,LINQ to Objects 就可讓開發人員使用 LINQ 查詢以存取記憶體內的物件。 LINQ 查詢提供一般模式以存取資料,比標準的 foreach
迴圈更精簡、可讀性更高,並提供篩選、排序和群組功能。 如需詳細資訊,請參閱 LINQ to Objects (C#) 和 LINQ to Objects (Visual Basic)。
PLINQ 提供 LINQ to Objects 的平行實作,這項實作透過更有效率地使用多核心電腦,在許多情況下會提供更快的查詢執行速度。 如需詳細資訊,請參閱 Parallel LINQ (PLINQ)。