何時使用泛型集合
使用泛型集合可提供您類型安全的自動好處,而無須衍生自基底集合類型同時實作類型專屬的成員。 當集合元素為實值類型,泛型集合類型也通常會優於對應的非泛型集合類型 (且優於衍生自非泛型基底集合類型的類型),因為有了泛型,就不需要對這些元素進行 box。
對於目標為 .NET Standard 1.0 或更新版本的程式,當多個執行緒可能同時在新增或移除集合中的項目時,您應使用 System.Collections.Concurrent 命名空間中的泛型集合類別。 此外,當需要不變性時,請考慮命名空間中的 System.Collections.Immutable 泛型集合類別。
下列泛型類型對應至現有的集合類型:
Dictionary<TKey,TValue> 和 ConcurrentDictionary<TKey,TValue> 是對應至 Hashtable的泛型類別。
Collection<T> 是對應至 CollectionBase的泛型類別。 Collection<T> 可以當做基底類別使用,但有別於 CollectionBase,它不是抽象的,因此遠遠更容易使用。
ReadOnlyCollection<T> 是對應至 ReadOnlyCollectionBase的泛型類別。 ReadOnlyCollection<T> 並非抽象,且具有一個建構函式,能輕鬆地將現有的 List<T> 公開為唯讀的集合。
Queue<T>、ConcurrentQueue<T>、ImmutableQueue<T>、ImmutableArray<T>、SortedList<TKey,TValue> 和 ImmutableSortedSet<T> 泛型類別對應至同名的個別非泛型類別。
其他類型
數個泛型集合類型沒有非泛型的對應項目。 這些因素包括:
LinkedList<T> 是提供 O(1) 插入和移除作業的一般用途連結清單。
SortedDictionary<TKey,TValue> 是 O(log
n
) 插入和擷取作業的已排序字典,這讓它成為 SortedList<TKey,TValue>相當實用的替代方法。KeyedCollection<TKey,TItem> 是清單與字典之間的混合體,它提供方法來儲存包含自己索引鍵的物件。
BlockingCollection<T> 會實作具有週框和封鎖功能的集合類別。
ConcurrentBag<T> 提供未排序項目的快速插入和移除。
不可變的產生器
當您希望應用程式中有不變性功能時,System.Collections.Immutable 命名空間會提供您可以使用的泛型集合類型。 所有不可變的集合類型都會提供 Builder
類別,可在您執行多個變動時將效能最佳化。 Builder
類別會批次處理處於可變動狀態的作業。 當所有變動都完成時,請呼叫 ToImmutable
方法來「凍結」所有節點,並建立不可變的泛型集合,例如 ImmutableList<T>。
呼叫非泛型 CreateBuilder()
方法,即可建立 Builder
物件。 您可以從 Builder
執行個體呼叫 ToImmutable()
。 同樣地,您可以從 Immutable*
集合呼叫 ToBuilder()
,以從泛型不可變集合建立產生器執行個體。 以下是各種 Builder
類型。
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
LINQ to Objects
只要物件類型實作 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 介面,LINQ to Objects 功能就可讓您使用 LINQ 查詢以存取記憶體中的物件。 LINQ 查詢提供一般模式以存取資料;通常比標準的 foreach
迴圈更精簡、可讀性更高;並提供篩選、排序和群組功能。 LINQ 查詢也可以提升效能。 如需詳細資訊,請參閱 LINQ to Objects (C#)、LINQ to Objects (Visual Basic) 和 Parallel LINQ (PLINQ)。
其他功能
某些泛型類型具有非泛型集合類型中找不到的功能。 例如, List<T> 類別 (對應至非泛型 ArrayList 類別) 有許多接受泛型委派的方法,例如 Predicate<T> 委派 (允許您指定方法來搜尋清單)、 Action<T> 委派 (代表對清單每個項目採取動作的方法),以及 Converter<TInput,TOutput> 委派 (可定義類型之間的轉換)。
List<T> 類別可讓您指定自己的 IComparer<T> 泛型介面實作,以排序及搜尋清單。 SortedDictionary<TKey,TValue> 和 SortedList<TKey,TValue> 類別也具有這項功能。 此外,這些類別可讓您在建立集合時,指定比較子。 Dictionary<TKey,TValue> 和 KeyedCollection<TKey,TItem> 類別會以類似的方式,讓您能指定自己的相等比較子。