首頁 > 後端開發 > C++ > 如何在 C# 中有效地將具有不同架構的多個 DataTable 合併到單一 DataTable 中?

如何在 C# 中有效地將具有不同架構的多個 DataTable 合併到單一 DataTable 中?

Barbara Streisand
發布: 2024-12-29 13:50:10
原創
310 人瀏覽過

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. (可選)如果表共用公用主鍵,則指定主鍵列的名稱鍵。
  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 |
登入後複製

要合併這三個表,我們可以呼叫MergeTables 方法,如下所示:

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

mergedTable將包含三個輸入表中的所有行,其中由公共主鍵列「c1」對齊的列。行中的任何缺失值將從具有相同主鍵值的第一個非空白行填入。

以上是如何在 C# 中有效地將具有不同架構的多個 DataTable 合併到單一 DataTable 中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板