1. HashSet.Add() 중복 허용 여부
HashSet<T>의 Add 메서드는 중복된 값을 허용하지 않습니다.
- 동작 원리: HashSet은 내부적으로 해시 테이블을 사용하여 데이터를 저장하며, 동일한 값(동일한 해시 값과 동등성을 가진 값)을 추가하려고 하면 false를 반환하고 값을 추가하지 않습니다.
- 예제:
HashSet<string> aaa = new HashSet<string>(); bool added1 = aaa.Add("Hello"); // 반환값: true (값이 추가됨) bool added2 = aaa.Add("Hello"); // 반환값: false (중복된 값, 추가되지 않음) Console.WriteLine(added1); // true Console.WriteLine(added2); // false |
2. HashSet의 주요 용도
HashSet<T>는 주로 다음과 같은 상황에서 사용됩니다:
1) 중복 제거
- HashSet은 중복된 값을 허용하지 않으므로, 중복 요소를 제거하고 고유한 값을 유지해야 할 때 적합합니다.
- 예제:
string[] items = { "apple", "banana", "apple", "orange", "banana" }; HashSet<string> uniqueItems = new HashSet<string>(items); foreach (var item in uniqueItems) { Console.WriteLine(item); } // 출력: apple, banana, orange |
2) 빠른 검색
- HashSet은 **O(1)**의 시간 복잡도로 항목을 검색합니다. 대량의 데이터를 처리하면서 특정 값의 존재 여부를 빠르게 확인해야 할 때 유용합니다.
- 예제:
HashSet<int> numbers = new HashSet<int> { 1, 2, 3, 4, 5 }; if (numbers.Contains(3)) { Console.WriteLine("3이 존재합니다."); } |
3) 집합 연산
- HashSet은 집합 연산(합집합, 교집합, 차집합)을 효율적으로 처리할 수 있는 메서드를 제공합니다.
- 합집합: UnionWith
- 교집합: IntersectWith
- 차집합: ExceptWith
- 대칭 차집합: SymmetricExceptWith
- 예제:
HashSet<int> set1 = new HashSet<int> { 1, 2, 3 }; HashSet<int> set2 = new HashSet<int> { 2, 3, 4 }; set1.IntersectWith(set2); // 교집합: { 2, 3 } foreach (var item in set1) { Console.WriteLine(item); // 출력: 2, 3 } |
4) 데이터 필터링
- 중복된 데이터를 제거하거나 특정 조건에 맞는 고유 데이터를 필터링하는 데 활용됩니다.
3. 장점
- 빠른 성능: HashSet은 값의 추가, 삭제, 검색이 평균적으로 **O(1)**의 시간 복잡도를 가집니다.
- 중복 방지: 값의 고유성을 보장합니다.
- 집합 연산 지원: 데이터 처리 시 유용한 집합 연산을 제공합니다.
4. 단점
- 순서가 없음: HashSet은 요소의 순서를 보장하지 않습니다. 순서가 중요한 경우 List 또는 SortedSet을 사용하는 것이 적합합니다.
- 추가적인 메모리 사용: 내부적으로 해시 테이블을 유지하기 때문에 메모리 사용량이 상대적으로 많을 수 있습니다.
5. 결론
HashSet<T>는 중복 제거와 빠른 검색이 필요한 상황, 또는 집합 연산을 효율적으로 수행하려는 경우에 매우 유용합니다. 단, 순서가 필요하지 않은 데이터를 처리할 때 적합합니다.
'c# 언어 > 중급과정' 카테고리의 다른 글
dotnet new 명령어의 동작 방식 (0) | 2025.03.13 |
---|---|
배열 인덱스 범위는 [startIndex..endIndex) 형식이므로, 0..5는 0부터 4까지, 총 5개의 바이트를 포함합니다. (0) | 2025.01.21 |
[Dot.Net]AppDomain.CurrentDomain.BaseDirectory: 현재 실행 중인 프로그램의 경로를 반환합니다. (0) | 2025.01.18 |
Json 구조체.출력형태 코드(따로따로, 혹은 전체) (0) | 2025.01.16 |
Visual Studio에서 app.manifest 파일 생성 및 설정 방법 (0) | 2025.01.15 |