ホームページ > バックエンド開発 > C++ > C# でさまざまなスキーマを持つ複数の DataTable を単一の DataTable に効率的にマージするにはどうすればよいですか?

C# でさまざまなスキーマを持つ複数の DataTable を単一の DataTable に効率的にマージするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-29 13:50:10
オリジナル
309 人が閲覧しました

How can I efficiently merge multiple DataTables with varying schemas into a single DataTable in C#?

可変スキーマを持つ複数の DataTable を単一のテーブルに結合する

複数の DataTable を単一のテーブルに結合する問題に対処するには、さまざまな列構造と行の配置。

簡単な解決策

次の C# コード スニペットは、簡単なアプローチを提供します。

public static DataTable MergeTables(IList<DataTable> tables, string primaryKeyColumn)
{
    if (!tables.Any())
        throw new ArgumentException("Tables must not be empty", "tables");
    if (primaryKeyColumn != null)
        foreach (DataTable t in tables)
            if (!t.Columns.Contains(primaryKeyColumn))
                throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn");

    if (tables.Count == 1)
        return tables[0];

    DataTable table = new DataTable("TblUnion");
    table.BeginLoadData(); // Turns off notifications, index maintenance, and constraints while loading data
    foreach (DataTable t in tables)
    {
        table.Merge(t); // same as table.Merge(t, false, MissingSchemaAction.Add);
    }
    table.EndLoadData();

    if (primaryKeyColumn != null)
    {
        // join rows with repeating primary key columns
        var pkGroups = table.AsEnumerable()
            .GroupBy(r => r[primaryKeyColumn]);
        var dupGroups = pkGroups.Where(g => g.Count() > 1);
        foreach (var grpDup in dupGroups)
        { 
            // use first row and modify it
            DataRow firstRow = grpDup.First();
            foreach (DataColumn c in table.Columns)
            {
                if (firstRow.IsNull(c))
                {
                    DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c));
                    if (firstNotNullRow != null)
                        firstRow[c] = firstNotNullRow[c];
                }
            }
            // remove all but first row
            var rowsToRemove = grpDup.Skip(1);
            foreach(DataRow rowToRemove in rowsToRemove)
                table.Rows.Remove(rowToRemove);
        }
    }

    return table;
}
ログイン後にコピー

使用法

MergeTables メソッドを利用するには、次の手順に従います。

  1. 入力 DataTable のリストを定義する.
  2. テーブルが共通の主キーを共有している場合は、オプションで主キー列の名前を指定します。 key.
  3. 該当する場合は、テーブルのリストと主キー列を指定して MergeTables メソッドを呼び出します。
  4. このメソッドは、マージされたデータを含む単一の DataTable を返し、列構造の不一致を処理し、行の配置。

次のサンプルを考えてみましょう。 DataTables:

DataTable1 (Columns: c1, c2, c3, c4)
| c1 | c2 | c3 | c4 |
|---|---|---|---|
| 1 | 8500 | abc | A |
| 2 | 950 | cde | B |
| 3 | 150 | efg | C |
| 4 | 850 | ghi | D |
| 5 | 50 | ijk | E |

DataTable2 (Columns: c1, c5, c6, c7)
| c1 | c5 | c6 | c7 |
|---|---|---|---|
| 1 | 7500 | klm | F |
| 2 | 900 | mno | G |
| 3 | 150 | opq | H |
| 4 | 850 | qrs | I |
| 5 | 50 | stu | J |

DataTable3 (Columns: c1, c8, c9, c10)
| c1 | c8 | c9 | c10 |
|---|---|---|---|
| 1 | 7500 | uvw | K |
| 2 | 900 | wxy | L |
| 3 | 150 | yza | M |
| 4 | 850 | ABC | N |
| 5 | 50 | CDE | O |
ログイン後にコピー

これら 3 つのテーブルをマージするには、次のように MergeTables メソッドを呼び出すことができます。

var tables = new[] { DataTable1, DataTable2, DataTable3 };
DataTable mergedTable = MergeTables(tables, "c1");
ログイン後にコピー

mergedTable には、3 つの入力テーブルのすべての行が含まれます。共通の主キー列「c1」によって整列された列。行内の欠損値は、同じ主キー値を持つ最初の非 null 行から移入されます。

以上がC# でさまざまなスキーマを持つ複数の DataTable を単一の DataTable に効率的にマージするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート