Maison >développement back-end >C++ >Comment puis-je fusionner efficacement plusieurs DataTables avec différentes structures en une seule table ?

Comment puis-je fusionner efficacement plusieurs DataTables avec différentes structures en une seule table ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-01 12:20:10272parcourir

How Can I Efficiently Merge Multiple DataTables with Different Structures into a Single Table?

Combiner plusieurs DataTables en un seul tableau complet

Défi :
Fusionner plusieurs DataTables avec des définitions de colonnes et des nombres de lignes différents tout en garantissant l'alignement et préserver l’intégrité des données peut être difficile.

Solution :
Pour surmonter ce problème et créer un seul DataTable complet, vous pouvez utiliser la méthode personnalisée suivante :

public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn)
{
    // Validate arguments
    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");

    DataTable table = new DataTable("TblUnion");

    // Disable data validation during bulk loading
    table.BeginLoadData();

    // Merge all tables into the result table
    foreach (DataTable t in tables)
        table.Merge(t, false, MissingSchemaAction.Add);

    // End data validation
    table.EndLoadData();

    // Handle duplicate primary keys (if specified)
    if (primaryKeyColumn != null)
    {
        // Group rows by primary key column
        var pkGroups = table.AsEnumerable().GroupBy(r => r[primaryKeyColumn]);

        // Identify groups with duplicate keys
        var dupGroups = pkGroups.Where(g => g.Count() > 1);

        // Combine data from duplicate rows into the first row of each group
        foreach (var grpDup in dupGroups)
        {
            // Use the first row and modify it to include data from other rows
            DataRow firstRow = grpDup.First();
            foreach (DataColumn c in table.Columns)
            {
                if (firstRow.IsNull(c))
                {
                    // Find the first non-null row for the current column and copy its value
                    DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c));
                    if (firstNotNullRow != null)
                        firstRow[c] = firstNotNullRow[c];
                }
            }

            // Remove duplicate rows
            var rowsToRemove = grpDup.Skip(1);
            foreach (DataRow rowToRemove in rowsToRemove)
                table.Rows.Remove(rowToRemove);
        }
    }

    // Return the merged table
    return table;
}

Utilisation :

var tables = new[] { tblA, tblB, tblC };
DataTable TblUnion = tables.MergeAll("c1");

Cette méthode fournit une solution robuste pour fusionner des DataTables, gérer l'alignement des données et préserver les clés données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn