Collection 클래스 선택
컬렉션 클래스를 신중하게 선택해야 합니다. 잘못된 형식을 사용하면 컬렉션 사용이 제한될 수 있습니다.
Important
System.Collections 네임스페이스에 있는 형식을 사용하지 않습니다. 형식 안전성이 더 크고 기타 향상된 기능이 있는 제네릭 버전과 동시 버전의 컬렉션을 사용하는 것이 좋습니다.
다음 질문을 살펴보세요.
값을 검색한 후 요소가 일반적으로 삭제되는 순차적 목록이 필요한가요?
예인 경우 FIFO(선입선출) 동작이 필요하면 Queue 클래스 또는 Queue<T> 제네릭 클래스를 사용합니다. LIFO(후입선출) 동작이 필요하면 Stack 클래스 또는 Stack<T> 제네릭 클래스를 사용합니다. 여러 스레드에서 안전하게 액세스하려면 동시 버전 ConcurrentQueue<T> 및 ConcurrentStack<T>을 사용합니다. 불변성의 경우 변경 불가능 버전, ImmutableQueue<T> 및 ImmutableStack<T>을 고려합니다.
그러지 않은 경우 다른 컬렉션을 사용합니다.
FIFO, LIFO, 무작위와 같은 특정 순서대로 요소에 액세스해야 하나요?
Queue 클래스는 물론 Queue<T>, ConcurrentQueue<T> 및 ImmutableQueue<T> 제네릭 클래스는 모두 FIFO 액세스를 제공합니다. 자세한 내용은 스레드로부터 안전한 컬렉션 사용 시기를 참조하세요.
Stack 클래스는 물론 Stack<T>, ConcurrentStack<T> 및 ImmutableStack<T> 제네릭 클래스는 모두 LIFO 액세스를 제공합니다. 자세한 내용은 스레드로부터 안전한 컬렉션 사용 시기를 참조하세요.
LinkedList<T> 제네릭 클래스는 헤드에서 테일로 또는 테일에서 헤드로 순차적 액세스를 허용합니다.
인덱스를 기준으로 각 요소에 액세스해야 하나요?
ArrayList 및 StringCollection 클래스와 List<T> 제네릭 클래스는 0부터 시작하는 요소 인덱스를 기준으로 해당 요소에 대한 액세스를 제공합니다. 불변성의 경우 변경할 수 없는 일반 버전, 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> 제네릭 클래스는 0부터 시작하는 요소 인덱스 또는 키를 기준으로 해당 요소에 대한 액세스를 제공합니다.
각 요소에 값 한 개, 키 한 개와 값 한 개의 조합 또는 키 한 개와 여러 값의 조합이 포함되나요?
값 한 개: 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> 제네릭 클래스는 키를 기준으로 요소를 정렬합니다. 정렬 순서는 SortedList 클래스의 IComparer 인터페이스 구현과 SortedList<TKey,TValue> 및 SortedDictionary<TKey,TValue> 제네릭 클래스의 IComparer<T> 제네릭 인터페이스 구현을 기반으로 합니다. 두 개의 제네릭 형식에서 SortedDictionary<TKey,TValue>는 SortedList<TKey,TValue>보다 성능이 더 뛰어나지만 SortedList<TKey,TValue>가 더 적은 메모리를 사용합니다.
ArrayList에서는 IComparer 구현을 매개 변수로 사용하는 Sort 메서드를 제공합니다. 해당하는 제네릭 항목인 List<T> 제네릭 클래스는 IComparer<T> 제네릭 인터페이스의 구현을 매개 변수로 사용하는 Sort 메서드를 제공합니다.
빠른 검색 및 정보 검색이 필요한가요?
- 작은 컬렉션(10개 항목 이하)의 경우 ListDictionary가 Hashtable보다 빠릅니다. Dictionary<TKey,TValue> 제네릭 클래스는 SortedDictionary<TKey,TValue> 제네릭 클래스보다 빠른 조회 기능을 제공합니다. 다중 스레드 구현은 ConcurrentDictionary<TKey,TValue>입니다. ConcurrentBag<T>은 순서가 지정되지 않은 데이터에 대한 신속한 다중 스레드 삽입 기능을 제공합니다. 두 가지 다중 스레드 형식에 대한 자세한 내용은 스레드로부터 안전한 컬렉션 사용 시기를 참조하세요.
문자열만 수락하는 컬렉션이 필요한가요?
StringCollection(IList 기반) 및 StringDictionary(IDictionary 기반)는 System.Collections.Specialized 네임스페이스에 있습니다.
또한 제네릭 형식 인수에 대해 String 클래스를 지정하여 System.Collections.Generic 네임스페이스의 제네릭 컬렉션 클래스 중 하나를 강력한 형식의 문자열 컬렉션으로 사용할 수 있습니다. 예를 들어, List<String> 또는 Dictionary<String,String> 형식의 변수를 선언할 수 있습니다.
LINQ to Objects 및 PLINQ
LINQ to Objects를 사용하면 개체 형식이 IEnumerable 또는 IEnumerable<T>를 구현하는 경우 개발자가 LINQ 쿼리를 통해 메모리 내 개체에 액세스할 수 있습니다. LINQ 쿼리는 데이터 액세스를 위한 일반 패턴을 제공하고, 표준 foreach
루프에 비해 간결하고 쉽게 읽을 수 있으며, 필터링, 순서 지정 및 그룹화 기능을 제공합니다. 자세한 내용은 LINQ to Objects(C#) 및 LINQ to Objects(Visual Basic)를 참조하세요.
PLINQ는 다중 코어 컴퓨터의 보다 효율적인 사용을 통해 많은 시나리오에서 더 빠른 쿼리 실행을 제공할 수 있는 LINQ to Objects의 병렬 구현을 제공합니다. 자세한 내용은 PLINQ(병렬 LINQ)를 참조하세요.
참고 항목
.NET