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

96voto

jai Points 921

Faites dtEmp sur votre DataTable de travail actuelle :

DataTable distinctTable = dtEmp.DefaultView.ToTable( /*distinct*/ true);

C'est bien.

8 votes

Cette réponse mérite plus d'attention, c'était exactement ce dont j'avais besoin et beaucoup plus simple que de construire une table de hachage / dictionnaire / peu importe tant que vous avez seulement besoin de filtrer les doublons exacts.

0 votes

Faites attention à la performance de cette solution. Dans mon implémentation ToTable() était assez lent, prenant 30 fois plus de temps que la requête originale qui a obtenu les données.

0 votes

C'est très bien mais cela peut être très, très lent pour des tables de données plus volumineuses. J'ai essayé cela sur une table de données avec 800k enregistrements et 20 colonnes environ et ça tournait pendant plusieurs minutes (je n'ai même pas attendu que ça se termine) sur mon PC Windows 7 avec 8 vCPU.

85voto

ratty Points 3926

Supprimer les doublons

public DataTable RemoveDuplicateRows(DataTable dTable, string colName)
{
   Hashtable hTable = new Hashtable();
   ArrayList duplicateList = new ArrayList();

   //Ajouter une liste de toutes les valeurs d'éléments uniques au hashtable, qui stocke la combinaison de paire clé-valeur.
   //Et ajouter la valeur d'élément en double dans arraylist.
   foreach (DataRow drow in dTable.Rows)
   {
      if (hTable.Contains(drow[colName]))
         duplicateList.Add(drow);
      else
         hTable.Add(drow[colName], string.Empty); 
   }

   //Supprimer une liste d'éléments en double du datatable.
   foreach (DataRow dRow in duplicateList)
      dTable.Rows.Remove(dRow);

   //Datatable contenant des enregistrements uniques sera renvoyé en sortie.
      return dTable;
}

Liens disponibles ci-dessous

http://www.dotnetspider.com/resources/4535-Remove-duplicate-records-from-table.aspx

http://www.dotnetspark.com/kb/94-remove-duplicate-rows-value-from-datatable.aspx

Pour supprimer les doublons dans une colonne

http://dotnetguts.blogspot.com/2007/02/removing-duplicate-records-from.html

23voto

Hasan Shouman Points 46

Une façon simple serait :

 var newDt = dt.AsEnumerable()
                 .GroupBy(x => x.Field("NomColonne"))
                 .Select(y => y.First())
                 .CopyToDataTable();

1 votes

Il s'agit de celui pour moi. Sans supprimer de colonnes supplémentaires, en ignorant simplement les enregistrements en double pour les noms de colonnes mentionnés.

16voto

Kanav SHarma Points 141

Ce post concerne la récupération uniquement des lignes distinctes d'un tableau de données sur la base de plusieurs colonnes.

Public coid removeDuplicatesRows(DataTable dt)
{
  DataTable uniqueCols = dt.DefaultView.ToTable(true, "RNORFQNo", "ManufacturerPartNo",  "RNORFQId", "ItemId", "RNONo", "Quantity", "NSNNo", "UOMName", "MOQ", "ItemDescription");
} 

Vous devez appeler cette méthode et assigner une valeur à la datatable. Dans le code ci-dessus, nous avons RNORFQNo, PartNo, RFQ id, ItemId, RNONo, Quantity, NSNNO, UOMName, MOQ et Item Description en tant que colonnes sur lesquelles nous voulons des valeurs distinctes.

5voto

Satinder singh Points 3089

Voici une manière facile et rapide d'utiliser AsEnumerable().Distinct()

private DataTable RemoveDuplicatesRecords(DataTable dt)
{
    // Retourne seulement 5 lignes uniques
    var UniqueRows = dt.AsEnumerable().Distinct(DataRowComparer.Default);
    DataTable dt2 = UniqueRows.CopyToDataTable();
    return dt2;
}

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