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

C# LINQ Intersect() 메서드로 두 배열의 교집합 구하기

C#의 LINQ에서 제공하는 Intersect() 메서드를 사용하면 두 배열 또는 컬렉션에 공통으로 존재하는 요소, 즉 교집합을 아주 간단하게 구할 수 있습니다.


먼저 예제로 사용할 두 개의 정수형 배열은 다음과 같습니다.

int[] val1 = { 15, 20, 40, 60, 75, 90 };
int[] val2 = { 17, 25, 35, 55, 75, 90 };

이 두 배열의 교집합을 구하려면 AsQueryable() 메서드로 쿼리 가능한 형태로 변환한 뒤 Intersect() 메서드를 호출하면 됩니다.

val1.AsQueryable().Intersect(val2);

Intersect() 메서드는 두 시퀀스에 모두 포함된 고유한(distinct) 요소만 반환합니다. 즉, 한쪽에만 존재하는 값은 결과에서 제외되며, 중복된 값 역시 한 번만 나타납니다.


전체 예제 코드

using System;
using System.Collections.Generic;
using System.Linq;
class Demo {
   static void Main() {
      int[] val1 = { 15, 20, 40, 60, 75, 90 };
      int[] val2 = { 17, 25, 35, 55, 75, 90 };
      IEnumerable<int> res = val1.AsQueryable().Intersect(val2);
      Console.WriteLine("Intersection of both the lists...");
      foreach (int a in res)
      Console.WriteLine(a);
   }
}

실행 결과

Intersection of both the lists...
75
90

실행 결과를 보면 7590, 단 두 개의 값만 출력된 것을 확인할 수 있습니다. 이 값들이 바로 두 배열에 동시에 존재하는 공통 요소, 즉 교집합입니다. 나머지 숫자들은 어느 한쪽 배열에만 있기 때문에 결과에서 제외되었습니다.


알아두면 좋은 점

- Intersect()는 기본 비교자(default comparer)를 사용하여 요소를 비교하므로, 문자열 컬렉션에서는 대소문자가 구분됩니다.
- 이 메서드는 지연 실행(deferred execution) 방식으로 동작하므로, 실제로 결과를 열거하는 시점(foreach 루프 등)에 연산이 수행됩니다.
- 사용자 지정 비교 로직이 필요하다면 IEqualityComparer<T>를 인자로 전달하는 오버로드를 활용할 수 있습니다.