프로그래밍 기술
[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