Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 다른 컬렉션을 활용해 HashSet 생성하는 방법

C#에서는 기존에 존재하는 다른 컬렉션을 그대로 전달하여 HashSet을 손쉽게 생성할 수 있습니다. HashSet 생성자는 IEnumerable<T> 타입의 컬렉션을 매개변수로 받기 때문에, 리스트·배열·다른 HashSet 등 어떤 컬렉션이든 소스로 사용할 수 있습니다. 특히 HashSet은 중복 요소를 자동으로 제거해 주므로, 중복이 포함된 데이터를 정리할 때 매우 유용합니다.

아래 예제를 통해 구체적인 사용 방법을 살펴보겠습니다.

예제 1: 정수형 HashSet 복사하기

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main() {
      HashSet<int> set1 = new HashSet<int>();
      set1.Add(100);
      set1.Add(200);
      set1.Add(300);

      Console.WriteLine("첫 번째 HashSet의 요소:");
      foreach(int i in set1) {
         Console.WriteLine(i);
      }

      // set1을 소스로 사용하여 새로운 HashSet 생성
      HashSet<int> set2 = new HashSet<int>(set1);

      Console.WriteLine("set1로부터 생성된 두 번째 HashSet의 요소:");
      foreach(int i in set2) {
         Console.WriteLine(i);
      }
   }
}

실행 결과

첫 번째 HashSet의 요소:
100
200
300
set1로부터 생성된 두 번째 HashSet의 요소:
100
200
300

위 코드에서 new HashSet<int>(set1)처럼 기존 컬렉션을 생성자에 전달하면, 해당 컬렉션의 모든 요소가 새로운 HashSet에 복사됩니다.

예제 2: 문자열 HashSet과 중복 제거 확인하기

이번에는 문자열 타입의 HashSet을 만들고, 동일한 값을 여러 번 추가했을 때 중복이 자동으로 제거되는지 확인해 보겠습니다.

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main() {
      HashSet<string> set1 = new HashSet<string>();
      set1.Add("Jacob");
      set1.Add("Tom");
      set1.Add("Harry");
      set1.Add("Harry");   // 중복
      set1.Add("Tom");     // 중복
      set1.Add("Harry");   // 중복

      Console.WriteLine("첫 번째 HashSet의 요소:");
      foreach(string i in set1) {
         Console.WriteLine(i);
      }

      // set1을 소스로 사용하여 새로운 HashSet 생성
      HashSet<string> set2 = new HashSet<string>(set1);

      Console.WriteLine("set1로부터 생성된 두 번째 HashSet의 요소:");
      foreach(string i in set2) {
         Console.WriteLine(i);
      }
   }
}

실행 결과

첫 번째 HashSet의 요소:
Jacob
Tom
Harry
set1로부터 생성된 두 번째 HashSet의 요소:
Jacob
Tom
Harry

핵심 정리

위 실행 결과를 보면 "Harry"와 "Tom"을 여러 번 추가했음에도 각각 한 번씩만 출력되는 것을 확인할 수 있습니다. 이는 HashSet이 내부적으로 해시 기반 구조를 사용하여 중복 값을 허용하지 않기 때문입니다.

  • 생성자 활용: HashSet<T>(IEnumerable<T> collection) 생성자에 기존 컬렉션을 전달하면 요소들이 복사됩니다.
  • 중복 자동 제거: 소스 컬렉션에 중복 값이 있어도 최종 HashSet에는 고유한 값만 저장됩니다.
  • 빠른 조회 성능: HashSet은 해시 테이블 기반으로 구현되어 있어 요소 검색과 추가가 평균 O(1)의 시간 복잡도로 처리됩니다.

이처럼 C#에서 다른 컬렉션으로부터 HashSet을 생성하면 코드가 간결해질 뿐만 아니라, 데이터의 고유성을 보장받을 수 있다는 장점이 있습니다.