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.
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; }
Untuk menggunakan kaedah MergeTables, ikut langkah berikut:
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!