請務必仔細選擇您的集合類別。 使用錯誤的類型可以限制您對集合的使用。
這很重要
請避免在命名空間中使用 System.Collections 類型。 建議使用集合的泛型和併發版本,因為它們具有更高的型別安全性及其他改進。
請考慮下列問題:
您是否需要一個循序列表,在擷取元素值後通常會丟棄該元素?
如果是,請考慮使用 Queue 類別或 Queue<T> 泛型類別,如果您需要先出先出 (FIFO) 行為。 如果您需要先出先出 (LIFO) 行為,請考慮使用 Stack 類別或 Stack<T> 泛型類別。 若要從多個線程進行安全存取,請使用並行版本 ConcurrentQueue<T> 和 ConcurrentStack<T>。 為了不變性,請考慮使用 ImmutableQueue<T> 和 ImmutableStack<T> 這些不可變版本。
如果沒有,請考慮使用其他的集合。
您需要以特定順序存取元素,例如 FIFO、LIFO 或隨機順序嗎?
類別 Queue 以及 Queue<T>、 ConcurrentQueue<T>和 ImmutableQueue<T> 泛型類別都提供 FIFO 存取。 如需詳細資訊,請參閱 使用 Thread-Safe 集合的時機。
類別 Stack 以及 Stack<T>、 ConcurrentStack<T>和 ImmutableStack<T> 泛型類別都提供 LIFO 存取權。 如需詳細資訊,請參閱 使用 Thread-Safe 集合的時機。
泛 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> 泛型類別會依索引鍵排序其元素。 排序順序是基於IComparer類別的SortedList介面實作,以及IComparer<T>和SortedList<TKey,TValue>泛型類別的SortedDictionary<TKey,TValue>泛型介面實作。 在兩個泛型類型中,SortedDictionary<TKey,TValue>提供比SortedList<TKey,TValue>更好的效能,而SortedList<TKey,TValue>則耗用較少的記憶體。
ArrayList 提供一個方法,該方法以 Sort 實作為參數 IComparer。 其泛型對應 List<T> 泛型類別提供一個 Sort 方法,此方法以泛型介面的實作 IComparer<T> 作為參數。
您需要快速搜尋和擷取資訊嗎?
- ListDictionary 在小型集合(10 個項目或更少)中比 Hashtable 更快。 泛 Dictionary<TKey,TValue> 型類別提供比 SortedDictionary<TKey,TValue> 泛型類別更快的查閱速度。 多線程實作為 ConcurrentDictionary<TKey,TValue>。 ConcurrentBag<T> 為未排序的數據提供快速的多線程插入。 如需這兩種多線程類型的詳細資訊,請參閱 使用 Thread-Safe 集合的時機。
您需要只接受字串的集合嗎?
StringCollection (根據 IList)和 StringDictionary (根據 IDictionary)位於 System.Collections.Specialized 命名空間中。
此外,您可以透過在泛型類別中指定 System.Collections.Generic 類別作為其泛型型別自變數,將命名空間 String 中的任何泛型集合類別用作強型別的字串集合。 例如,您可以將變數宣告為 List<String> 或 Dictionary<String,String> 類型。
LINQ to 物件 和 PLINQ
只要物件類型實作 IEnumerable 或 IEnumerable<T>,LINQ to Objects 可讓開發人員使用 LINQ 查詢來存取記憶體內部物件。 LINQ 查詢提供存取數據的常見模式,通常比標準 foreach
迴圈更簡潔且更容易閱讀,並提供篩選、排序和分組功能。 如需詳細資訊,請參閱 LINQ to Objects (C#) 和 LINQ to Objects (Visual Basic) 。
PLINQ 提供 LINQ to Objects 的平行實作,可在許多案例中提供更快速的查詢執行,透過更有效率地使用多核心計算機。 如需詳細資訊,請參閱 平行 LINQ (PLINQ) 。