프로그래밍 기술

[C#] DataTable 차집합 Difference 구하는 두 가지 방법

zero2one 2025. 4. 29. 21:40
728x90

프로그래밍을 하다보면 두 개의 집합 사이 관계를 계산해야 될 때가 많습니다. 아래는 DataTable의 활용 시에 두 개의 Table 사이에 차집합을 구하는 LINQ를 활용한 두 가지 예입니다. 비교적 간단하거나 짧은 행의 Table에 적용하면 유용하며, 또한 처리 시간에 구애받지 않는다면 유용할 수 있습니다. 큰 Table들이면서 실시간 처리가 목적이라면 어렵지 않을까 합니다.

 

첫 번째 예제에서는 AsEnumerable().Where()와 Any()문을 활용하여 특정 행을 비교하여 차집합을 구하는 방식입니다. 두 번째 예에서는 AsEnumerable().Except()와 DataRowComparer.Default를 이용한 방식 입니다.

 

예제 #1. AsEnumerable().Where() 사용 예

using System;
using System.Data;
using System.Linq;

class Program
{
    static void Main()
    {
        // 첫 번째 DataTable 생성 및 데이터 추가
        DataTable dt1 = new DataTable();
        dt1.Columns.Add("Num", typeof(int));
        dt1.Columns.Add("Tag", typeof(string));

        dt1.Rows.Add(1, "A");
        dt1.Rows.Add(2, "B");
        dt1.Rows.Add(3, "C");

        // 두 번째 DataTable 생성 및 데이터 추가
        DataTable dt2 = new DataTable();
        dt2.Columns.Add("Num", typeof(int));
        dt2.Columns.Add("Tag", typeof(string));

        dt2.Rows.Add(2, "B");
        dt2.Rows.Add(3, "C");

        // 차집합: dt1에는 있고 dt2에는 없는 행
        var difference = dt1.AsEnumerable()
            .Where(row1 => !dt2.AsEnumerable().Any(row2 =>
                row1.Field<int>("Num") == row2.Field<int>("Num") &&
                row1.Field<string>("Tag") == row2.Field<string>("Tag")));

        // 결과 출력
        Console.WriteLine("차집합 결과 (dt1 - dt2):");
        foreach (var row in difference)
        {
            Console.WriteLine($"ID: {row["Num"]}, Name: {row["Tag"]}");
        }
    }
}

 

예제 #2. AsEnumerable().Except() 사용 예

using System;
using System.Data;
using System.Linq;

class Program
{
    static void Main()
    {
        // 첫 번째 DataTable 생성
        DataTable dt1 = new DataTable();
        dt1.Columns.Add("Num", typeof(int));
        dt1.Columns.Add("Tag", typeof(string));

        dt1.Rows.Add(1, "A");
        dt1.Rows.Add(2, "B");
        dt1.Rows.Add(3, "C");

        // 두 번째 DataTable 생성
        DataTable dt2 = new DataTable();
        dt2.Columns.Add("Num", typeof(int));
        dt2.Columns.Add("Tag", typeof(string));

        dt2.Rows.Add(2, "B");
        dt2.Rows.Add(3, "C");

        // 차집합 구하기
        var difference = dt1.AsEnumerable()
                            .Except(dt2.AsEnumerable(), DataRowComparer.Default);

        // 결과 출력
        DataTable resultTable = difference.CopyToDataTable();
        Console.WriteLine("차집합 결과:");
        foreach (DataRow row in resultTable.Rows)
        {
            Console.WriteLine($"{row["Num"]}, {row["Tag"]}");
        }
    }
}

 

728x90