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

C# SortedSet과 컬렉션의 교집합(Intersection) 구하는 방법

C#에서 SortedSet과 다른 컬렉션 간의 교집합을 구하려면 IntersectWith() 메서드를 사용합니다. 이 메서드는 현재 SortedSet 객체를 수정하여, 두 집합에 공통으로 존재하는 요소만 남깁니다.

IntersectWith() 메서드란?

IntersectWith(IEnumerable<T> other)는 매개변수로 전달된 컬렉션과 현재 집합을 비교한 뒤, 양쪽 모두에 있는 요소만 현재 집합에 유지합니다. SortedSet은 항상 정렬된 상태와 중복 없음을 보장하기 때문에, 연산 결과 역시 오름차순으로 정렬되어 반환됩니다.

예제 1: 정수형 SortedSet의 교집합

두 개의 정수형 SortedSet을 만들고 교집합을 구하는 코드입니다.

using System;
using System.Collections.Generic;

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

      SortedSet<int> set2 = new SortedSet<int>();
      set2.Add(450);
      set2.Add(200);
      set2.Add(650);
      set2.Add(300);
      set2.Add(800);

      Console.WriteLine("두 집합이 같은가? = " + set1.SetEquals(set2));

      set1.IntersectWith(set2);

      Console.WriteLine("결과 SortedSet...");
      foreach(int val in set1){
         Console.WriteLine(val);
      }
   }
}

실행 결과

두 집합이 같은가? = False
결과 SortedSet...
200
300

위 예제에서 set1에는 {100, 200, 300}, set2에는 {200, 300, 450, 650, 800}이 저장되어 있습니다. 두 집합은 서로 다르므로 SetEquals()는 False를 반환하고, 교집합 연산 후에는 공통 요소인 200과 300만 남게 됩니다.

예제 2: 문자열 SortedSet과 열거자(Enumerator) 활용

이번에는 문자열 타입의 SortedSet 두 개를 사용하고, GetEnumerator()로 열거자를 직접 순회하는 예제입니다.

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(){
      SortedSet<string> set1 = new SortedSet<string>();
      set1.Add("AB");
      set1.Add("BC");
      set1.Add("CD");
      set1.Add("EF");
      set1.Add("PQ");
      set1.Add("ST");

      Console.WriteLine("SortedSet1의 요소...");
      foreach (string res in set1){
         Console.WriteLine(res);
      }
      Console.WriteLine("SortedSet1의 요소 개수 = " + set1.Count);

      SortedSet<string> set2 = new SortedSet<string>();
      set2.Add("BC");
      set2.Add("CD");
      set2.Add("DE");
      set2.Add("EF");
      set2.Add("AB");
      set2.Add("HI");
      set2.Add("JK");

      Console.WriteLine("SortedSet2의 요소(Enumerator 사용)...");
      SortedSet<string>.Enumerator demoEnum = set2.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }
      Console.WriteLine("SortedSet2의 요소 개수 = " + set2.Count);

      set1.IntersectWith(set2);

      Console.WriteLine("결과 SortedSet...");
      foreach(string val in set1){
         Console.WriteLine(val);
      }
   }
}

실행 결과

SortedSet1의 요소...
AB
BC
CD
EF
PQ
ST
SortedSet1의 요소 개수 = 6
SortedSet2의 요소(Enumerator 사용)...
AB
BC
CD
DE
EF
HI
JK
SortedSet2의 요소 개수 = 7
결과 SortedSet...
AB
BC
CD
EF

첫 번째 집합은 6개, 두 번째 집합은 7개의 문자열을 가지고 있으며, 교집합 연산 결과 공통 요소인 AB, BC, CD, EF 네 개만 결과 SortedSet에 남습니다.

정리

  • IntersectWith() 메서드는 현재 SortedSet을 수정하여 두 컬렉션의 공통 요소만 남깁니다.
  • SetEquals() 메서드는 두 집합이 동일한 요소를 가지는지 여부를 bool 값으로 반환합니다.
  • SortedSet은 자동으로 정렬 및 중복 제거를 수행하므로, 교집합 결과도 항상 정렬된 상태로 유지됩니다.
  • GetEnumerator()를 사용하면 foreach 문 없이도 열거자를 통해 집합의 요소를 순회할 수 있습니다.