제네릭 컬렉션 사용 기준
제네릭 컬렉션은 기본 컬렉션 형식에서 파생하고 형식별 멤버를 구현하지 않아도 형식 안전성의 이점을 즉시 얻을 수 있으므로 이 컬렉션을 사용하는 것이 좋습니다. 또한 컬렉션 요소가 형식 값인 경우 해당 요소를 boxing하지 않아도 되므로 제네릭 컬렉션 형식은 해당 제네릭이 아닌 컬렉션 형식 및 제네릭이 아닌 기본 컬렉션 형식에서 파생되는 형식보다 일반적으로 성능이 더 좋습니다.
.NET Framework 버전 4 이상을 대상으로 하는 프로그램의 경우 여러 스레드가 동시에 컬렉션에서 항목을 추가하거나 제거할 수 있으면 System.Collections.Concurrent 네임스페이스의 제네릭 컬렉션 클래스를 사용해야 합니다.
기존 컬렉션 형식에 해당하는 제네릭 형식은 다음과 같습니다.
Dictionary<TKey, TValue> 및 ConcurrentDictionary<TKey, TValue>는 Hashtable에 상응하는 제네릭 클래스입니다.
Collection<T>은 CollectionBase에 해당하는 제네릭 클래스입니다. Collection<T>은 기본 클래스로 사용될 수 있지만 CollectionBase와 달리 추상 클래스가 아닙니다. 사용하기가 훨씬 쉽습니다.
ReadOnlyCollection<T>은 ReadOnlyCollectionBase에 해당하는 제네릭 클래스입니다. ReadOnlyCollection<T> 클래스는 추상 클래스가 아니며 기존 List<T>를 읽기 전용 컬렉션으로 쉽게 노출할 수 있도록 하는 생성자를 포함합니다.
Queue<T>, ConcurrentQueue<T>, Stack<T>, ConcurrentStack<T> 및 SortedList<TKey, TValue> 제네릭 클래스는 같은 이름을 가진 각각의 제네릭이 아닌 클래스에 해당합니다.
추가 형식
제네릭 컬렉션 형식 중에는 그에 상응하는 제네릭이 아닌 형식이 없는 것도 많습니다. 이러한 범주는 다음과 같습니다.
LinkedList<T>은 O(1) 삽입 및 제거 작업을 제공하는 일반 용도의 연결된 목록입니다.
SortedDictionary<TKey, TValue>는 O(로그 n) 삽입 및 검색 작업으로 정렬된 사전으로 SortedList<TKey, TValue> 대신 유용하게 사용할 수 있습니다.
KeyedCollection<TKey, TItem>는 목록과 사전의 혼합형으로, 해당 고유 키를 포함하는 개체를 저장하는 방식을 제공합니다.
BlockingCollection<T>은 경계 및 차단 기능이 있는 컬렉션 클래스를 구현합니다.
ConcurrentBag<T>을 사용하면 순서가 지정되지 않은 요소를 빠르게 삽입 및 제거할 수 있습니다.
LINQ to Objects
LINQ to Objects 기능을 사용하면 개체 형식이 System.Collections.IEnumerable 또는 System.Collections.Generic.IEnumerable<T> 인터페이스를 구현하는 경우 LINQ 쿼리를 통해 메모리 내 개체에 액세스할 수 있습니다. LINQ 쿼리는 데이터 액세스를 위한 일반 패턴을 제공하고, 표준 foreach 루프에 비해 간결하고 쉽게 읽을 수 있으며, 필터링, 순서 지정 및 그룹화 기능을 제공합니다. 또한 LINQ 쿼리를 통해 성능을 향상시킬 수도 있습니다. 자세한 내용은 LINQ to Objects 및 PLINQ(병렬 LINQ)를 참조하십시오.
추가 기능
일부 제네릭 형식은 제네릭이 아닌 컬렉션 형식에 없는 기능을 포함합니다. 예를 들어, 제네릭이 아닌 ArrayList 클래스에 해당하는 List<T> 클래스에는 목록을 검색하는 메서드를 지정할 수 있는 Predicate<T> 대리자, 목록의 각 요소에서 동작하는 메서드를 나타내는 Action<T> 대리자 및 형식 간의 변환을 정의할 수 있는 Converter<TInput, TOutput> 대리자와 같은 제네릭 대리자를 허용하는 메서드가 많이 있습니다.
List<T> 클래스를 사용하면 목록을 정렬하고 검색하기 위한 고유한 IComparer<T> 제네릭 인터페이스 구현을 지정할 수 있습니다. SortedDictionary<TKey, TValue> 및 SortedList<TKey, TValue> 클래스에도 이 기능이 있습니다. 또한 컬렉션을 만들 때 이들 클래스를 사용하여 비교자를 지정할 수 있습니다. 이런 식으로 Dictionary<TKey, TValue> 및 KeyedCollection<TKey, TItem> 클래스를 사용하면 사용자 고유의 같음 비교자를 지정할 수 있습니다.