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

C# LINQ Except() 메서드 – 두 배열 간의 차이 집합 구하기

C#에서는 Except() 메서드를 사용하여 두 배열 또는 컬렉션 간의 차이, 즉 첫 번째 컬렉션에는 있지만 두 번째 컬렉션에는 없는 요소들을 손쉽게 구할 수 있습니다.

Except() 메서드란?

Except()는 System.Linq 네임스페이스에 포함된 집합 연산자 중 하나로, 첫 번째 시퀀스에서 두 번째 시퀀스에 포함된 요소들을 제외한 나머지 요소들을 반환합니다. 기본 비교자(Default Comparer)를 사용하며, 결과에는 중복된 요소가 제거된 상태로 반환됩니다.

예제 배열 살펴보기

다음과 같은 두 개의 정수형 배열이 있다고 가정해 보겠습니다.

int[] arr = { 9, 12, 15, 20, 35, 40, 55, 67, 88, 92 };
int[] arr2 = { 20, 35 };

arr2에 포함된 요소(20, 35)를 arr에서 제외한 결과를 얻으려면 Except() 메서드를 다음과 같이 호출하면 됩니다. 이 메서드는 두 번째 목록에 있는 요소들을 제외한 첫 번째 목록을 반환합니다.

arr.AsQueryable().Except(arr2);

전체 예제 코드

using System;
using System.Linq;
using System.Collections.Generic;

class Program {
   static void Main() {
      int[] arr = { 5, 10, 15, 20, 35, 40 };
      int[] except = { 20, 35 };

      Console.WriteLine("초기 리스트...");
      foreach(int ele in arr)
      Console.WriteLine(ele);

      IEnumerable<int> res = arr.AsQueryable().Except(except);

      Console.WriteLine("새 리스트...");
      foreach (int a in res)
      Console.WriteLine(a);
   }
}

실행 결과

초기 리스트...
5
10
15
20
35
40
새 리스트...
5
10
15
40

참고 사항

Except()는 지연 실행(lazy evaluation) 방식으로 동작하므로, foreach 루프 등을 통해 실제로 열거할 때 쿼리가 실행됩니다. 또한 두 컬렉션의 요소가 사용자 정의 타입이라면 IEquatable<T> 인터페이스를 구현하거나 IEqualityComparer를 별도로 지정해야 올바르게 비교됩니다. 참고로 AsQueryable()은 시퀀스를 IQueryable 형태로 변환하는 역할만 하며, LINQ to Objects 환경에서는 생략해도 동일하게 동작합니다.