Introduction
- .NET 런타임은 객체 그룹을 관리하는 다양한 컬렉션 형식을 제공한다.
일부 컬렉션 형식 (Array, System.Span<T>, System.Memory<T>) 은 C# 언어로 인식된다.
또한 IEnumerable<T>와 같은 인터페이스는 컬렉션의 요소를 열거하기 위한 언어로 인식된다.
C# 12부터, 컬렉션은 컬렉션 식을 사용하여 초기화할 수 있다.
- 컬렉션은 다음과 같은 특징으로 분류할 수 있다.
- 요소 액세스 : 컬렉션을 열거하고 각 요소에 액세스하는 방법이 다르다.
- 인덱스 : List<T>와 같은 컬렉션은 각 요소의 위치인 인덱스를 통해 요소에 액세스한다.
- 키 : Dictionary<TKey, TValue>와 같은 컬렉션은 키를 통해 요소에 액세스한다.
- 성능 프로필 : 각 컬렉션은 요소 추가, 찾기 또는 제거와 같은 작업에 대해 성능 프로필이 다르다.
- 동적 확장 및 축소
- 많은 컬렉션은 동적으로 요소를 추가하거나 제거하는 것이 가능하다.
- 일부 컬렉션 (Array, System.Span<T>, System.Memory<T>, ...) 의 경우 동적 확장 및 추가가 불가하다.
- 동시 액세스 : 특정 컬렉션 (System.Collections.Concurrent) 은 다중 스레드 시나리오에서 액세스에 대한 보안을 제공한다.
- 요소 액세스 : 컬렉션을 열거하고 각 요소에 액세스하는 방법이 다르다.
- 특정 시나리오에 대한 컬렉션 선택에 대해서는 Collection 클래스 선택을 참조한다.
인덱싱 가능한 컬렉션
인덱스를 통해 요소에 액세스 하는 컬렉션의 인덱스는
0
부터 시작한다.다음은 List<T>를 이용한 간단한 예시이다.
List<int> ints = [1, 2, 3, 4, 5]; var second = ints.ElementAt(2); // 3번째 요소 확인 ints[2] = 7; // 3번째 요소를 7로 교체 ints.RemoveAt(3); // 4번째 요소를 제거 ints.ForEach(x => Console.Write($"{x} ")); /* output: 1 2 7 5 */
키/값 컬렉션
키를 통해 요소에 액세스 하는 컬렉션의 접근은 인덱스를 통한 방법과 동일하다.
다음은 Dictionary<TKey, TValue>를 이용한 간단한 예시이다.
Dictionary<string, int> dic = new() { { "Zero", 0 }, { "One", 1 }, { "Two", 2 }, { "Three", 3 }, { "Four", 4 } }; Console.WriteLine(dic.ContainsKey("Three")); // Three 요소 확인 dic["Three"] = 7; // Three 요소를 7로 교체 dic.Remove("One"); // One 요소 제거 foreach (var pair in dic) { Console.WriteLine($"Key : {pair.Key}, value : {pair.Value}"); } /* output: True Key : Zero, value : 0 Key : Two, value : 2 Key : Three, value : 7 Key : Four, value : 4 */
반복기
반복기는 컬렉션에 대한 반복 작업을 수행하는 데 사용한다.
프로퍼티의 getter 또는 메서드일 수 있으며, foreach, yield return문을 사용한다.
다음은 반복기를 사용하는 간단한 예시이다.
List<int> ints = [1, 10, 6, 3, 4, 7]; foreach (int value in GetUnder5(ints)) { Console.Write($"{value} "); } IEnumerable<int> GetUnder5(List<int> ints) { foreach (int value in ints) { if (value < 5) yield return value; } } /* output: 1 3 4 */
LINQ
LINQ를 사용하여 컬렉션에 액세스 할 수 있다.
다음 예시에서는 LINQ 쿼리를 이용하는 간단한 예시이다.
List<int> ints = [1, 10, 6, 3, 4, 7]; var result = from value in ints where value < 5 select value; foreach (var value in result) Console.Write($"{value} "); /* output: 1 3 4 */