Maison > développement back-end > C++ > Comment puis-je fusionner efficacement plusieurs DataTables avec différents schémas en un seul DataTable en C# ?

Comment puis-je fusionner efficacement plusieurs DataTables avec différents schémas en un seul DataTable en C# ?

Barbara Streisand
Libérer: 2024-12-29 13:50:10
original
309 Les gens l'ont consulté

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

Combinaison de plusieurs DataTables avec des schémas variables en une seule table

Pour résoudre le problème de la combinaison de plusieurs DataTables en une seule table, nous recommandons une méthode efficace qui gère efficacement les différentes structures de colonnes et alignement des lignes.

Solution rapide

L'extrait de code C# suivant fournit une solution simple approche :

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;
}
Copier après la connexion

Utilisation

Pour utiliser la méthode MergeTables, suivez ces étapes :

  1. Définissez une liste de DataTables d'entrée.
  2. Eventuellement, spécifiez le nom de la colonne de clé primaire si les tables partagent une clé primaire commune.
  3. Appelez le Méthode MergeTables avec la liste des tables et la colonne de clé primaire, le cas échéant.
  4. La méthode renvoie un seul DataTable avec les données fusionnées, en gérant les écarts dans les structures de colonnes et l'alignement des lignes.

Exemple

Considérez les exemples de DataTables suivants :

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 |
Copier après la connexion

Pour fusionner ces trois tables, nous pouvons appeler la méthode MergeTables comme suit :

var tables = new[] { DataTable1, DataTable2, DataTable3 };
DataTable mergedTable = MergeTables(tables, "c1");
Copier après la connexion

Le mergedTable contiendra toutes les lignes des trois tables d'entrée, avec les colonnes alignées par la colonne de clé primaire commune "c1". Toutes les valeurs manquantes dans une ligne seront renseignées à partir de la première ligne non nulle avec la même valeur de clé primaire.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal