La meilleure façon de supprimer les entrées en double d'une table de données

Quelle est la meilleure façon de supprimer les entrées en double d'une Table de données?

32
demandé sur Benjamin 2010-12-11 09:26:15

9 réponses

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

66
répondu ratty 2010-12-11 06:34:34

dtEmp sur votre travail en cours DataTable:

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

c'est sympa.

62
répondu jai 2013-02-01 11:16:58

ce post concerne la récupération seulement les lignes distinctes de la table 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 assigner une valeur à datatable. Dans le code ci-dessus nous avons RNORFQNo , PartNo,RFQ id,ItemId, RNONo, QUantity, NSNNO, UOMName,MOQ, et description D'article comme colonne sur laquelle nous voulons des valeurs distinctes.

12
répondu Kanav SHarma 2013-03-13 10:56:04

une façon simple serait:

 var newDt= dt.AsEnumerable()
                 .GroupBy(x => x.Field<int>("ColumnName"))
                 .Select(y => y.First())
                 .CopyToDataTable();
10
répondu Hasan Shouman 2016-11-23 06:53:26

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);
3
répondu Tom 2013-09-20 05:41:43

Heres un moyen facile et rapide à l'aide de 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;
}

Cliquez pour visiter mon blog pour plus de détails

2
répondu Satinder singh 2013-03-07 10:02:07
    /* 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();
        }
    }
1
répondu veman 2013-03-20 11:14:39

Vous pouvez utiliser DefaultView.Méthode totalisable D'un DataTable pour faire le filtrage comme ceci (adapt to 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
0
répondu David Ruiz 2018-01-19 18:55:29

lignes complètement distinctes:

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

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

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

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

public static void Distinct(this DataTable dataTable, string distinctColumnName)
{
    var distinctResult = new DataTable();
    distinctResult.Merge(
                     .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
répondu Dan Kashkovsky 2018-04-02 09:25:25