제네릭 컬렉션 사용 기준

제네릭 컬렉션을 사용하면 기본 컬렉션 형식에서 파생하고 형식별 멤버를 구현하지 않고도 형식 안전성의 이점을 자동으로 얻을 수 있습니다. 또한 컬렉션 요소가 값 형식일 때는 제네릭 컬렉션 형식이 제네릭이 아닌 해당 컬렉션 형식(및 제네릭이 아닌 기본 컬렉션 형식에서 파생되는 형식)에 비해 일반적으로 성능도 뛰어납니다. 제네릭을 사용하는 경우에는 요소를 boxing할 필요가 없기 때문입니다.

.NET Standard 1.0 이상을 대상으로 하는 프로그램의 경우 여러 스레드가 컬렉션에서 동시에 항목을 추가하거나 제거하는 경우 System.Collections.Concurrent 네임스페이스에서 제네릭 컬렉션 클래스를 사용해야 합니다. 또한 불변성이 필요한 경우 System.Collections.Immutable 네임스페이스의 제네릭 컬렉션 클래스를 고려합니다.

기존 컬렉션 형식에 해당하는 제네릭 형식은 다음과 같습니다.

추가 형식

다수의 제네릭 컬렉션 형식에는 그에 해당하는 제네릭이 아닌 형식이 없습니다. 여기에는 다음 항목들이 포함됩니다.

  • LinkedList<T> 는 O(1) 삽입 및 제거 작업을 제공하는 범용 연결된 목록입니다.

  • SortedDictionary<TKey,TValue> 는 O(로그 n) 삽입 및 검색 작업을 제공하는 정렬된 사전으로, SortedList<TKey,TValue>대신 사용하면 유용합니다.

  • KeyedCollection<TKey,TItem> 은 자체 키를 포함하는 개체를 저장할 수 있도록 하는 목록과 사전 간의 하이브리드 형식입니다.

  • BlockingCollection<T> 는 경계 및 차단 기능을 포함하는 컬렉션 클래스를 구현합니다.

  • ConcurrentBag<T> 는 순서가 지정되지 않은 요소의 빠른 삽입 및 제거 기능을 제공합니다.

변경할 수 없는 빌더

앱에서 불변성 기능을 원하는 경우 System.Collections.Immutable 네임스페이스는 사용할 수 있는 제네릭 컬렉션 형식을 제공합니다. 변경할 수 없는 모든 컬렉션 형식은 여러 변경을 수행하는 경우 성능을 최적화할 수 있는 Builder 클래스를 제공합니다. Builder 클래스는 변경 가능한 상태로 작업을 일괄 처리합니다. 모든 변경이 완료되면 ToImmutable 메서드를 호출하여 모든 노드를 “동결”하고 ImmutableList<T>와 같은 변경할 수 없는 제네릭 컬렉션을 만듭니다.

Builder 개체는 제네릭이 아닌 CreateBuilder() 메서드를 호출하여 만들 수 있습니다. Builder 인스턴스에서 ToImmutable()을 호출할 수 있습니다. 마찬가지로 Immutable* 컬렉션에서 ToBuilder()를 호출하여 제네릭 변경 불가능 컬렉션에서 작성기 인스턴스를 만들 수 있습니다. 다음은 다양한 Builder 형식입니다.

LINQ to Objects

LINQ to Objects 기능을 사용하면 개체 형식이 System.Collections.IEnumerable 또는 System.Collections.Generic.IEnumerable<T> 인터페이스를 구현하는 경우 LINQ 쿼리를 통해 메모리 내 개체에 액세스할 수 있습니다. LINQ 쿼리는 데이터 액세스를 위한 일반 패턴을 제공하고, 표준 foreach 루프에 비해 간결하고 쉽게 읽을 수 있으며, 필터링, 순서 지정 및 그룹화 기능을 제공합니다. 또한 LINQ 쿼리를 통해 성능을 향상시킬 수도 있습니다. 자세한 내용은 LINQ to Objects(C#), LINQ to Objects(Visual Basic)병렬 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> 클래스에서도 고유한 같음 비교자를 지정할 수 있습니다.

참고 항목