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
Lepaskan: 2024-12-29 13:50:10
asal
310 orang telah melayarinya

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;
}
Salin selepas log masuk

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 |
Salin selepas log masuk

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

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

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan