Collection 클래스 선택
컬렉션 클래스는 주의하여 선택하십시오. 잘못된 형식을 사용할 경우 컬렉션의 사용이 제한될 수 있습니다. .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> 제네릭 클래스는 요소의 0부터 시작하는 인덱스를 기준으로 해당 요소에 대한 액세스를 제공합니다.
Hashtable, SortedList, ListDictionary 및 StringDictionary 클래스와 Dictionary<TKey, TValue> 및 SortedDictionary<TKey, TValue> 제네릭 클래스는 요소의 키를 기준으로 해당 요소에 대한 액세스를 제공합니다.
NameObjectCollectionBase 및 NameValueCollection 클래스와 KeyedCollection<TKey, TItem> 및 SortedList<TKey, TValue> 제네릭 클래스는 요소의 0부터 시작하는 인덱스 또는 키를 기준으로 해당 요소에 대한 액세스를 제공합니다.
각 요소에 하나의 값, 또는 하나의 키와 하나의 값 조합, 또는 하나의 키와 여러 값 조합이 포함되어야 합니까?
하나의 키 및 하나의 값: IDictionary 인터페이스 또는 IDictionary<TKey, TValue> 제네릭 인터페이스를 기반으로 컬렉션을 사용합니다.
키가 포함된 하나의 값: KeyedCollection<TKey, TItem> 제네릭 클래스를 사용합니다.
하나의 키와 여러 값: NameValueCollection 클래스를 사용합니다.
요소가 입력된 순서와 다르게 요소를 정렬해야 합니까?
Hashtable 클래스는 요소를 해시 코드별로 정렬합니다.
SortedList 클래스와 SortedDictionary<TKey, TValue> 및 SortedList<TKey, TValue> 제네릭 클래스는 IComparer 인터페이스 및 IComparer<T> 제네릭 인터페이스의 구현을 기반으로 요소를 키별로 정렬합니다.
ArrayList는 IComparer 구현을 매개 변수로 사용하는 Sort 메서드를 제공합니다. List<T> 제네릭 클래스는 IComparer<T> 제네릭 인터페이스 구현을 매개 변수로 사용하는 Sort 메서드를 제공합니다.
정보에 대한 빠른 검색이 필요합니까?
- 항목이 10개 이하인 작은 컬렉션의 경우 ListDictionary가 Hashtable보다 빠릅니다. Dictionary<TKey, TValue> 제네릭 클래스를 사용하면 SortedDictionary<TKey, TValue> 제네릭 클래스보다 빠르게 조회할 수 있습니다. 다중 스레드 구현은 ConcurrentDictionary<TKey, TValue>입니다. ConcurrentBag<T>에서는 순서가 지정되지 않은 데이터의 신속한 다중 스레드 삽입을 제공합니다. 두 가지 다중 스레드 형식에 대한 자세한 내용은 스레드로부터 안전한 컬렉션 사용 시기를 참조하십시오.
문자열만 수용하는 컬렉션이 필요합니까?
IList 기반의 StringCollection과 IDictionary 기반의 StringDictionary는 System.Collections.Specialized 네임스페이스에 있습니다.
또한 제네릭 형식 인수에 대해 String 클래스를 지정하여 System.Collections.Generic 네임스페이스의 제네릭 컬렉션 클래스를 강력한 형식의 문자열 컬렉션으로 사용할 수 있습니다.
LINQ to Objects 및 PLINQ
개체 형식이 IEnumerable 또는 IEnumerable<T>을 구현하는 경우 개발자는 LINQ to Objects 기능을 통해 LINQ 쿼리를 사용하여 메모리 내 개체에 액세스할 수 있습니다. LINQ 쿼리는 데이터 액세스를 위한 일반 패턴을 제공하고, 표준 foreach 루프에 비해 간결하고 쉽게 읽을 수 있으며, 필터링, 순서 지정 및 그룹화 기능을 제공합니다. 자세한 내용은 LINQ to Objects를 참조하십시오.
PLINQ는 LINQ to Objects의 병렬 구현을 제공하며, 다중 코어 컴퓨터를 보다 효율적으로 활용하여 여러 시나리오에서 쿼리 실행 속도를 높일 수 있습니다. 자세한 내용은 PLINQ(병렬 LINQ)를 참조하십시오.
참고 항목
참조
System.Collections.Specialized