web-dev-qa-db-fra.com

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?

38
Ananth

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;
}

Ici 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

70
ratty

Faites dtEmp sur votre DataTable actuel:

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

C'est bien.

75
jai

Ce message concerne la récupération uniquement des lignes Distincts du 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 vous devez attribuer une valeur à datatable. Dans le code ci-dessus, nous avons RNORFQNo, PartNo, RFQ id, ItemId, RNONo, QUantity, NSNNO, UOMName, MOQ et Item Description comme colonne sur laquelle nous voulons des valeurs distinctes.

14
Kanav SHarma

Un moyen simple serait:

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

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
Tom

Voici un moyen simple et rapide d'utiliser 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
Satinder singh
    /* 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
veman

Vous pouvez utiliser la méthode DefaultView.ToTable d'un DataTable pour effectuer le filtrage comme ceci (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
0
David Ruiz

Lignes complètement distinctes:

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

Distingué par des lignes particulières (notez que les colonnes mentionnées dans "distinctCulumnNames" seront retournées dans le 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 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
Denys Kashkovskyi

Afin de distinguer toutes les colonnes datatable, vous pouvez facilement récupérer les noms des colonnes dans un tableau de chaînes

public static DataTable RemoveDuplicateRows(this DataTable dataTable)
{
    List<string> columnNames = new List<string>();
    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 comme une extension de la classe DataTable

0
Aymen Dghaies