選取集合類別
請務必小心選擇集合類別。 用錯型別將會限制集合的用途。 一般而言,除非您特別以 .NET Framework 1.1 版為目標,否則請避免使用 System.Collections 命名空間中的型別。 您應該優先使用這些集合的泛型和並行版本,因為它們提供較佳的型別安全和其他改良。
請考慮下列問題:
您是否需要循序清單,而其中的元素基本上會在擷取其值之後被捨棄?
如果是,若需要先進先出 (FIFO) 的行為,請考慮使用 Queue 類別或 Queue<T> 泛型類別。 若需要後進先出 (LIFO) 的行為,請考慮使用 Stack 類別或 Stack<T> 泛型類別。 若要從多個執行緒進行安全存取,請使用並行版本 ConcurrentQueue<T> 和 ConcurrentStack<T>。
如果不是,則考慮使用其他集合。
您是否需要以特定順序 (例如 FIFO、LIFO 或隨機) 存取元素?
Queue 類別和 Queue<T> 或 ConcurrentQueue<T> 泛型類別可提供 FIFO 的存取方式。 如需詳細資訊,請參閱使用安全執行緒集合的時機。
Stack 類別和 Stack<T> 或 ConcurrentStack<T> 泛型類別可提供 LIFO 的存取方式。 如需詳細資訊,請參閱使用安全執行緒集合的時機。
LinkedList<T> 泛型類別允許從頭到尾或從尾到頭方向的循序存取。
您是否需要透過索引來存取各個元素?
ArrayList 和 StringCollection 類別以及 List<T> 泛型類別透過元素以零起始的索引,提供對其元素的存取方式。
Hashtable、SortedList、ListDictionary 和 StringDictionary 類別以及 Dictionary<TKey, TValue> 和 SortedDictionary<TKey, TValue> 泛型類別提供藉由元素索引鍵存取其元素的方式。
NameObjectCollectionBase 和 NameValueCollection 類別以及 KeyedCollection<TKey, TItem> 和 SortedList<TKey, TValue> 泛型類別透過元素以零起始的索引或索引鍵,提供對其元素的存取方式。
各個元素是否將包含一個值、一個索引鍵和一個值的組合,或一個索引鍵和多個值的組合?
一個索引鍵和一個值:依據 IDictionary 介面或 IDictionary<TKey, TValue> 泛型介面來使用任何集合。
一個具有內嵌索引鍵的值:使用 KeyedCollection<TKey, TItem> 泛型類別。
一個索引鍵和數個值:使用 NameValueCollection 類別 (Class)。
您是否需要以不同於元素輸入的方式來將其排序?
Hashtable 類別會以其元素的雜湊程式碼來排序元素。
SortedList 類別以及 SortedDictionary<TKey, TValue> 和 SortedList<TKey, TValue> 泛型類別會依據 IComparer 介面和 IComparer<T> 泛型介面的實作,以索引鍵排序其元素。
ArrayList 提供採用 IComparer 實作做為參數的 Sort 方法。 它的泛型對應項目 (也就是 List<T> 泛型類別) 會提供 Sort 方法,此方法採用 IComparer<T> 泛型介面的實作做為參數。
您是否需要快速的資訊搜尋和擷取?
- 處理小型集合 (十個項目或更少) 時,ListDictionary 比 Hashtable 來得快。 Dictionary<TKey, TValue> 泛型類別的查閱速度則比 SortedDictionary<TKey, TValue> 泛型類別還要快。 多執行緒實作是 ConcurrentDictionary<TKey, TValue>。 ConcurrentBag<T> 會針對未排序的資料提供快速的多執行緒插入。 如需多執行緒型別的詳細資訊,請參閱使用安全執行緒集合的時機。
您是否需要只接受字串的集合?
StringCollection (以 IList 為基礎) 和 StringDictionary (以 IDictionary 為基礎) 均位於 System.Collections.Specialized 命名空間內。
此外,您也可以使用 System.Collections.Generic 命名空間中的任何泛型集合類別做為強型別字串集合,只需指定其泛型型別引數的 String 類別即可達成此目的。
LINQ to Objects 和 PLINQ
只要物件型別實作 IEnumerable 或 IEnumerable<T>,LINQ to Objects 就可讓開發人員使用 LINQ 查詢存取記憶體中的物件。 LINQ 查詢會提供一般模式以存取資料,比標準的 foreach 迴圈 (Loop) 更精簡、可讀性更高,並提供篩選、排序和群組功能。 如需詳細資訊,請參閱 LINQ to Objects。
PLINQ 會提供 LINQ to Objects 的平行實作,而這種實作會以更有效率的方式使用多核心電腦,藉以在許多案例中提供更快的查詢執行速度。 如需詳細資訊,請參閱 平行 LINQ (PLINQ)。
請參閱
參考
System.Collections.Specialized