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

C#에서 두 리스트를 비교하여 차이점을 새로운 리스트에 담는 방법

개요

C#에서 두 개의 리스트(List)를 비교하고, 그 차이에 해당하는 요소들만 모아 새로운 리스트를 만들어야 하는 경우가 종종 있습니다. 이럴 때 LINQ에서 제공하는 Except() 메서드를 활용하면 아주 간단하게 해결할 수 있습니다. 이번 글에서는 기본 예제부터 전체 실행 코드까지 단계별로 살펴보겠습니다.

1. 두 개의 리스트 준비하기

먼저 비교할 두 개의 문자열 리스트를 생성합니다.

첫 번째 리스트

List<string> list1 = new List<string>();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");

위 리스트는 A, B, C, D 네 개의 요소를 가지고 있습니다.

두 번째 리스트

List<string> list2 = new List<string>();
list2.Add("C");
list2.Add("D");

두 번째 리스트에는 C와 D만 포함되어 있습니다. 따라서 첫 번째 리스트에만 존재하는 요소는 A와 B입니다.

2. Except() 메서드로 차이점 찾기

두 리스트의 차이를 구할 때는 Except() 메서드를 사용합니다. 이 메서드는 첫 번째 컬렉션에는 있지만 두 번째 컬렉션에는 없는 요소들만 반환합니다.

IEnumerable<string> list3;
list3 = list1.Except(list2);

foreach (string value in list3) {
    Console.WriteLine(value);
}

실행 결과로 AB가 출력됩니다. 즉, list3에는 두 리스트의 차이에 해당하는 요소들이 담기게 됩니다.

참고: Except() 메서드는 중복된 값을 자동으로 제거하며, 기본 비교자(Default Comparer)를 사용해 요소를 비교합니다. 대소문자 구분 없이 비교하려면 StringComparer.OrdinalIgnoreCase 같은 사용자 지정 비교자를 인수로 전달할 수 있습니다.

3. 전체 예제 코드

지금까지의 내용을 하나로 합친 완전한 예제는 다음과 같습니다.

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

public class Demo {
    public static void Main() {
        // 첫 번째 리스트 생성
        List<string> list1 = new List<string>();
        list1.Add("A");
        list1.Add("B");
        list1.Add("C");
        list1.Add("D");

        Console.WriteLine("첫 번째 리스트...");
        foreach (string value in list1) {
            Console.WriteLine(value);
        }

        // 두 번째 리스트 생성
        Console.WriteLine("두 번째 리스트...");
        List<string> list2 = new List<string>();
        list2.Add("C");
        list2.Add("D");

        foreach (string value in list2) {
            Console.WriteLine(value);
        }

        // 두 리스트의 차이 계산
        Console.WriteLine("두 리스트의 차이...");
        IEnumerable<string> list3;
        list3 = list1.Except(list2);

        foreach (string value in list3) {
            Console.WriteLine(value);
        }
    }
}

실행 결과

첫 번째 리스트...
A
B
C
D
두 번째 리스트...
C
D
두 리스트의 차이...
A
B

마무리

이처럼 C#의 LINQ Except() 메서드를 사용하면 복잡한 반복문 없이도 두 리스트 간의 차이를 손쉽게 구해 새로운 컬렉션에 담을 수 있습니다. 교집합을 구하고 싶다면 Intersect(), 합집합이 필요하다면 Union() 메서드를 함께 활용해 보시기 바랍니다.