Heim > Backend-Entwicklung > C++ > Wie kann ich mehrere DataTables mit unterschiedlichen Schemata effizient zu einer einzigen DataTable in C# zusammenführen?

Wie kann ich mehrere DataTables mit unterschiedlichen Schemata effizient zu einer einzigen DataTable in C# zusammenführen?

Barbara Streisand
Freigeben: 2024-12-29 13:50:10
Original
310 Leute haben es durchsucht

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

Kombinieren mehrerer DataTables mit Variablenschemata in einer einzigen Tabelle

Um das Problem der Kombination mehrerer DataTables in einer einzigen Tabelle zu lösen, empfehlen wir eine effiziente Methode, die das effektiv bewältigt unterschiedliche Spaltenstrukturen und Zeilenausrichtung.

Schnelle Lösung

Das folgende C#-Code-Snippet bietet eine Einfacher Ansatz:

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;
}
Nach dem Login kopieren

Verwendung

Um die MergeTables-Methode zu verwenden, befolgen Sie diese Schritte:

  1. Definieren Sie eine Liste von Eingabedatentabellen.
  2. Geben Sie optional den Namen der Primärschlüsselspalte an, wenn die Tabellen einen gemeinsamen Primärschlüssel haben.
  3. Aufruf die MergeTables-Methode mit der Liste der Tabellen und der Primärschlüsselspalte, falls zutreffend.
  4. Die Methode gibt eine einzelne DataTable mit den zusammengeführten Daten zurück und behandelt alle Abweichungen in den Spaltenstrukturen und der Zeilenausrichtung.

Beispiel

Betrachten Sie die folgenden Beispieldatentabellen:

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 |
Nach dem Login kopieren

An Um diese drei Tabellen zusammenzuführen, können wir die MergeTables-Methode wie folgt aufrufen:

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

Die mergedTable enthält alle Zeilen aus den drei Eingabetabellen, wobei die Spalten durch die gemeinsame Primärschlüsselspalte „c1“ ausgerichtet sind. Alle fehlenden Werte in einer Zeile werden aus der ersten Nicht-Null-Zeile mit demselben Primärschlüsselwert aufgefüllt.

Das obige ist der detaillierte Inhalt vonWie kann ich mehrere DataTables mit unterschiedlichen Schemata effizient zu einer einzigen DataTable in C# zusammenführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage