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

C#에서 두 HashSet의 교집합 구하는 방법

C#에서 두 HashSet의 교집합(Intersection)을 구하려면 IntersectWith() 메서드를 사용하면 됩니다. 이 메서드는 현재 HashSet 객체 자체를 수정하여, 인자로 전달된 컬렉션과 공통으로 포함된 요소만 남기고 나머지는 모두 제거합니다.

예제 1: 문자열 HashSet의 교집합

다음은 두 개의 문자열 HashSet에서 교집합을 구하는 전체 코드입니다.

using System;
using System.Collections.Generic;
public class Demo {
   public static void Main(){
      HashSet<string> set1 = new HashSet<string>();
      set1.Add("AB");
      set1.Add("CD");
      set1.Add("EF");
      set1.Add("AB");
      set1.Add("IJ");
      set1.Add("KL");
      set1.Add("EF");
      set1.Add("OP");
      Console.WriteLine("HashSet1의 요소");
      foreach(string val in set1){
         Console.WriteLine(val);
      }
      HashSet<string> set2 = new HashSet<string>();
      set2.Add("EF");
      set2.Add("KL");
      Console.WriteLine("\nHashSet2의 요소");
      foreach(string val in set2){
         Console.WriteLine(val);
      }
      Console.WriteLine("HashSet2의 요소 개수 = " + set2.Count);
      set2.Remove("KL");
      Console.WriteLine("\nHashSet2의 요소... (업데이트 후)");
      foreach (string res in set2){
         Console.WriteLine(res);
      }
      Console.WriteLine("HashSet2의 요소 개수 (업데이트 후) = " + set2.Count);
      Console.WriteLine("\nset1이 set2의 상위 집합인가요? "+set1.IsSupersetOf(set2));
      set1.IntersectWith(set2);
      Console.WriteLine("\n교집합 결과...");
      foreach(string str in set1){
         Console.WriteLine(str);
      }
   }
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

HashSet1의 요소
AB
CD
EF
IJ
KL
OP
HashSet2의 요소
EF
KL
HashSet2의 요소 개수 = 2
HashSet2의 요소... (업데이트 후)
EF
HashSet2의 요소 개수 (업데이트 후) = 1
set1이 set2의 상위 집합인가요? True
교집합 결과...
EF

코드 설명

위 예제에서는 먼저 중복 값을 포함해 여러 요소를 추가했습니다. HashSet은 중복을 허용하지 않으므로 "AB"와 "EF"는 각각 한 번만 저장됩니다. 이후 Remove() 메서드로 "KL"을 제거하고, IsSupersetOf() 메서드로 set1이 set2의 상위 집합인지 확인한 뒤, IntersectWith()를 호출하여 교집합을 구했습니다. 그 결과 두 집합에 공통으로 존재하는 "EF"만 남게 됩니다.

예제 2: 정수 HashSet의 교집합

이번에는 정수형 HashSet으로 동일한 작업을 수행해 보겠습니다.

using System;
using System.Collections.Generic;
public class Demo {
   public static void Main(){
      HashSet<int> set1 = new HashSet<int>();
      set1.Add(30);
      set1.Add(60);
      set1.Add(70);
      set1.Add(80);
      set1.Add(100);
      set1.Add(125);
      Console.WriteLine("HashSet1의 요소");
      foreach(int val in set1){
         Console.WriteLine(val);
      }
      HashSet<int> set2 = new HashSet<int>();
      set2.Add(30);
      set2.Add(60);
      set2.Add(70);
      set2.Add(80);
      set2.Add(100);
      set2.Add(125);
      Console.WriteLine("\nHashSet2의 요소");
      foreach(int val in set2){
         Console.WriteLine(val);
      }
      set1.IntersectWith(set2);
      Console.WriteLine("\n교집합 결과...");
      foreach(int val in set1){
         Console.WriteLine(val);
      }
   }
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

HashSet1의 요소
30
60
70
80
100
125
HashSet2의 요소
30
60
70
80
100
125
교집합 결과...
30
60
70
80
100
125

정리

두 HashSet의 모든 요소가 동일하기 때문에 교집합 결과 역시 전체 요소가 그대로 유지됩니다. 이처럼 IntersectWith() 메서드는 원본 집합을 직접 변경한다는 점에 유의하세요. 원본을 유지하고 싶다면 LINQ의 Intersect() 확장 메서드를 사용해 새로운 컬렉션으로 결과를 받는 방법도 좋은 대안입니다.