Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menggabungkan berbilang DataTables dengan skema yang berbeza-beza ke dalam satu DataTable dalam C#?

Bagaimanakah saya boleh menggabungkan berbilang DataTables dengan skema yang berbeza-beza ke dalam satu DataTable dalam C#?

Barbara Streisand
Barbara Streisandasal
2024-12-29 13:50:10321semak imbas

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

Menggabungkan Berbilang Jadual Data dengan Skema Pembolehubah ke dalam Jadual Tunggal

Untuk menangani isu menggabungkan berbilang Jadual Data ke dalam satu jadual, kami mengesyorkan kaedah yang cekap yang mengendalikan dengan berkesan pelbagai struktur lajur dan penjajaran baris.

Penyelesaian Pantas

The coretan kod C# berikut menyediakan pendekatan yang mudah:

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;
}

Penggunaan

Untuk menggunakan kaedah MergeTables, ikut langkah berikut:

  1. Tentukan senarai input DataTable .
  2. Secara pilihan, nyatakan nama lajur kunci utama jika jadual berkongsi asas utama yang sama kekunci.
  3. Panggil kaedah MergeTables dengan senarai jadual dan lajur kunci utama, jika berkenaan.
  4. Kaedah ini mengembalikan satu Jadual Data dengan data yang digabungkan, mengendalikan sebarang percanggahan dalam struktur lajur dan penjajaran baris.

Contoh

Pertimbangkan perkara berikut contoh Jadual Data:

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 |

Untuk menggabungkan ketiga-tiga jadual ini, kita boleh memanggil kaedah MergeTables seperti berikut:

var tables = new[] { DataTable1, DataTable2, DataTable3 };
DataTable mergedTable = MergeTables(tables, "c1");

Jadual gabungan akan mengandungi semua baris daripada tiga jadual input, dengan lajur yang dijajarkan oleh lajur kunci utama biasa "c1". Sebarang nilai yang tiada dalam satu baris akan diisi daripada baris bukan nol pertama dengan nilai kunci utama yang sama.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menggabungkan berbilang DataTables dengan skema yang berbeza-beza ke dalam satu DataTable dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn