2010-12-11 3 views

Répondre

63

Supprimer les doublons

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

    //Add list of all the unique item value to hashtable, which stores combination of key, value pair. 
    //And add duplicate item value in arraylist. 
    foreach (DataRow drow in dTable.Rows) 
    { 
     if (hTable.Contains(drow[colName])) 
     duplicateList.Add(drow); 
     else 
     hTable.Add(drow[colName], string.Empty); 
    } 

    //Removing a list of duplicate items from datatable. 
    foreach (DataRow dRow in duplicateList) 
     dTable.Rows.Remove(dRow); 

    //Datatable which contains unique records will be return as output. 
     return dTable; 
} 

Liens 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 la colonne

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

+0

: Comment puis-je le faire pour plusieurs colonnes. J'ai essayé d'inclure string [] colName.But Table.Rows.Remove (dRow); Lance une erreur comme "Le DataRow donné n'est pas dans le DataRowCollection en cours" .Veuillez suggérer. – user1495475

+0

Vous devrez modifier le foreach de façon incrémentielle sur plusieurs niveaux. Cependant, utiliser Linq pourrait être plus facile. http://stackoverflow.com/questions/8939516/how-to-find-duplicate-record-using-linq-from-datatable – miracules

+0

Le lien de dotnetspark a fonctionné pour moi, car je devais supprimer des lignes uniquement si les lignes de 2 colonnes correspondent . Cela ne fonctionne que pour un seul type, mais ça me va bien !! – DarkPh03n1X

57

Est-ce dtEmp sur votre travail actuel DataTable:

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

Il est agréable.

+6

Cette réponse mérite plus d'attention, était exactement ce dont j'avais besoin et beaucoup plus simple que la construction d'un hashtable/dictionnaire/quoi que ce soit tant que vous avez seulement besoin de filtrer les doublons exacts. – lee

+0

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

+0

Cet extrait de code est ce que je veux.simple et génial. –

2

Heres un moyen facile et rapide à l'aide AsEnumerable().Distinct()

private DataTable RemoveDuplicatesRecords(DataTable dt) 
{ 
    //Returns just 5 unique rows 
    var UniqueRows = dt.AsEnumerable().Distinct(DataRowComparer.Default); 
    DataTable dt2 = UniqueRows.CopyToDataTable(); 
    return dt2; 
} 

CLICK to visit my blog for more Detail

+1

Merci d'avoir posté votre réponse! Veuillez vous assurer de lire attentivement la [FAQ sur l'autopromotion] (http://stackoverflow.com/faq#promotion). Notez également qu'il est * obligatoire * que vous publiez une clause de non-responsabilité chaque fois que vous créez un lien vers votre propre site/produit. J'ajoute la divulgation pour vous ici; essayez de garder cela à l'esprit pour l'avenir! –

+0

c'est très lent .. – LuckyS

12

Ce poste est seulement aller chercher en ce qui concerne les lignes de la table Services distincts 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 vous devez affecter une valeur à datatable. Dans le code ci-dessus, nous avons RNORFQNo, PartNo, ID RFQ, ItemId, RNONo, QUantity, NSNNO, UOMName, MOQ, et Description de l'article en tant que colonne sur laquelle nous voulons des valeurs distinctes.

+0

Merci beaucoup. Aide vraiment :) Solution facile – Rebecca

1
/* To eliminate Duplicate rows */ 
    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(); 
     } 
    } 
3

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); 
+0

Je suppose que vous n'avez pas besoin de grouper par count() == 1 ou vous obtiendrez toutes les lignes de toute façon. –

8

Une façon simple serait:

var newDt= dt.AsEnumerable() 
       .GroupBy(x => x.Field<int>("ColumnName")) 
       .Select(y => y.First()) 
       .CopyToDataTable(); 
0

lignes complètement distinctes:

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

Distinct par ligne particulière (s) (Notez que les colonnes mentionnées dans "distinctCulumnNames" seront retournés dans résultant DataTable):

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

Distinct par colonne particulière (conserve toutes les colonnes DataTable donné):

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

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

Vous pouvez utiliser la DefaultView.ToTable méthode d'un DataTable pour faire le filtrage comme celui-ci (adapter à 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 

    'Build column list 
    For Each pColumn In rDataTable.Columns 
     pColumnList.Add(pColumn.ColumnName) 
    Next 

    'Filter by all columns 
    pNewDataTable = rDataTable.DefaultView.ToTable(True, pColumnList.ToArray) 

    rDataTable = rDataTable.Clone 

    'Import rows into original table structure 
    For Each pCurrentRowCopy In pNewDataTable.Rows 
     rDataTable.ImportRow(pCurrentRowCopy) 
    Next 
End Sub 
Questions connexes