【C#】同じ構造を持つDataTableとDataTableを比較しの差分を抽出する | LDKの徒然日記

LDKの徒然日記

脱力系エンジニアの日常を綴る・・・

DataTableとか、もはや廃れてますけど、同じ構造を持つDataTableとDataTableを比較して、
差分を抽出するロジックです。

自分は今でも結構DataTable使うんだよなぁ。でもあんまり需要ないのかネット見てもあんまり具体的なサンプル無いので、
備忘録的に置いときます。

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

namespace ConsoleApp30 {
    class Program {
        static void Main(string[] args) {

            // ■テーブル1を作る
            DataTable dtBefore = new DataTable();

            dtBefore.Columns.Add("SEQ", typeof(int));
            dtBefore.Columns.Add("商品名", typeof(string));

            DataRow addRow = null;

            addRow = null;
            addRow = dtBefore.NewRow();
            addRow["SEQ"] = 1;
            addRow["商品名"] = "りんご";
            dtBefore.Rows.Add(addRow);

            addRow = null;
            addRow = dtBefore.NewRow();
            addRow["SEQ"] = 2;
            addRow["商品名"] = "ばなな";
            dtBefore.Rows.Add(addRow);

            addRow = null;
            addRow = dtBefore.NewRow();
            addRow["SEQ"] = 3;
            addRow["商品名"] = "めろん";
            dtBefore.Rows.Add(addRow);

            addRow = null;
            addRow = dtBefore.NewRow();
            addRow["SEQ"] = 4;
            addRow["商品名"] = "ぶどう";
            dtBefore.Rows.Add(addRow);

            addRow = null;
            addRow = dtBefore.NewRow();
            addRow["SEQ"] = 5;
            addRow["商品名"] = "なし";
            dtBefore.Rows.Add(addRow);

            // ■テーブル2を作る
            DataTable dtAfter = new DataTable();

            dtAfter.Columns.Add("SEQ", typeof(int));
            dtAfter.Columns.Add("商品名", typeof(string));

            addRow = null;
            addRow = dtAfter.NewRow();
            addRow["SEQ"] = 1;
            addRow["商品名"] = "りんご";
            dtAfter.Rows.Add(addRow);

            addRow = null;
            addRow = dtAfter.NewRow();
            addRow["SEQ"] = 2;
            addRow["商品名"] = "ぶどう";
            dtAfter.Rows.Add(addRow);

            addRow = null;
            addRow = dtAfter.NewRow();
            addRow["SEQ"] = 3;
            addRow["商品名"] = "めろん";
            dtAfter.Rows.Add(addRow);

            addRow = null;
            addRow = dtAfter.NewRow();
            addRow["SEQ"] = 4;
            addRow["商品名"] = "ばなな";
            dtAfter.Rows.Add(addRow);

            addRow = null;
            addRow = dtAfter.NewRow();
            addRow["SEQ"] = 5;
            addRow["商品名"] = "きうい";
            dtAfter.Rows.Add(addRow);

            // ■テーブル1とテーブル2の差分を抽出
            DataTable dtDiff = new DataTable();

            var wkDiffs = dtBefore.AsEnumerable().Except(dtAfter.AsEnumerable(), DataRowComparer.Default);

            if (wkDiffs.Any()) {
                dtDiff = wkDiffs.CopyToDataTable();

                foreach (DataRow dtRow in dtDiff.Rows) {
                    Console.WriteLine("SEQ:" + dtRow["SEQ"]);
                    Console.WriteLine("商品名:" + dtRow["商品名"]);
                }
            }

        }
    }
}
--------------------------------------------------------