43 votes

Meilleure façon de supprimer les entrées en double d'un tableau de données

Quel est le meilleur moyen de supprimer les entrées en double d'une table de données?

1 votes

Désolé de poster ma réponse à nouveau ici. Veuillez également consulter stackoverflow.com/a/24387929/815600

3voto

veman Points 11
    /* Pour éliminer les lignes en double */
    private void RemoveDuplicates(DataTable dt)
    {

        if (dt.Rows.Count > 0)
        {
            for (int i = dt.Rows.Count - 1; i >= 0; i--)
            {
                if (i == 0)
                {
                    break;
                }
                for (int j = i - 1; j >= 0; j--)
                {
                    if (Convert.ToInt32(dt.Rows[i]["ID"]) == Convert.ToInt32(dt.Rows[j]["ID"]) && dt.Rows[i]["Name"].ToString() == dt.Rows[j]["Name"].ToString())
                    {
                        dt.Rows[i].Delete();
                        break;
                    }
                }
            }
            dt.AcceptChanges();
        }
    }

3voto

Tom Points 31

Il existe un moyen simple d'utiliser la méthode Linq GroupBy.

var duplicateValues = dt.AsEnumerable() 

        .GroupBy(row => row[0]) 

        .Where(group => (group.Count() == 1 || group.Count() > 1)) 

        .Select(g => g.Key); 

foreach (var d in duplicateValues)

        Console.WriteLine(d);

2voto

Rangées complètement distinctes :

public static DataTable Dictinct(this dt) => dt.DefaultView.ToTable(true);

Distinctes par des rangée(s) particulières (Notez que les colonnes mentionnées dans "distinctCulumnNames" seront renvoyées dans le DataTable résultant) :

public static DataTable Dictinct(this dt, params string[] distinctColumnNames) => 
dt.DefaultView.ToTable(true, distinctColumnNames);

Distinctes par une colonne particulière (préserve toutes les colonnes dans le DataTable donné) :

public static void Distinct(this DataTable dataTable, string distinctColumnName)
{
    var distinctResult = new DataTable();
    distinctResult.Merge(
                     .GroupBy(row => row.Field(distinctColumnName))
                     .Select(group => group.First())
                     .CopyToDataTable()
            );

    if (distinctResult.DefaultView.Count < dataTable.DefaultView.Count)
    {
        dataTable.Clear();
        dataTable.Merge(distinctResult);
        dataTable.AcceptChanges();
    }
}

0voto

David Ruiz Points 65

Vous pouvez utiliser la méthode DefaultView.ToTable d'un DataTable pour effectuer le filtrage de cette manière (adaptée en C#) :

 Public Sub RemoveDuplicateRows(ByRef rDataTable As DataTable)
    Dim pNewDataTable As DataTable
    Dim pCurrentRowCopy As DataRow
    Dim pColumnList As New List(Of String)
    Dim pColumn As DataColumn

    'Construire la liste des colonnes
    For Each pColumn In rDataTable.Columns
        pColumnList.Add(pColumn.ColumnName)
    Next

    'Filtrer par toutes les colonnes
    pNewDataTable = rDataTable.DefaultView.ToTable(True, pColumnList.ToArray)

    rDataTable = rDataTable.Clone

    'Importer les lignes dans la structure de table d'origine
    For Each pCurrentRowCopy In pNewDataTable.Rows
        rDataTable.ImportRow(pCurrentRowCopy)
    Next
End Sub

0voto

Aymen Dghaies Points 21

Pour distinguer toutes les colonnes du tableau de données, vous pouvez facilement récupérer les noms des colonnes dans un tableau de chaînes

public static DataTable RemoveDuplicateRows(this DataTable dataTable)
{
    List columnNames = new List();
    foreach (DataColumn col in dataTable.Columns)
    {
        columnNames.Add(col.ColumnName);
    }
    return dataTable.DefaultView.ToTable(true, columnNames.Select(c => c.ToString()).ToArray());
}

Comme vous pouvez le constater, j'ai pensé l'utiliser en tant qu'extension de la classe DataTable

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X