2010-12-11 17 views

Odpowiedz

63

Usuń duplikaty

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

Oto linki poniżej

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

Aby usunąć duplikaty w kolumnie

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

+0

: Jak mogę to zrobić dla wielu kolumn. Próbowałem użyć ciągu [] colName.But Table.Rows.Remove (dRow); zgłasza błąd taki jak "Podana dataRow nie jest w bieżącym DataRowCollection" .Proszę zasugerować. – user1495475

+0

Konieczne byłoby stopniowe modyfikowanie foreach na większej liczbie poziomów. Jednak korzystanie z Linq może być łatwiejsze. http://stackoverflow.com/questions/8939516/how-to-find-duplicate-record-using-linq-from-datatable – miracules

+0

Link z dotnetspark pracował dla mnie, ponieważ musiałem usunąć wiersze tylko wtedy, gdy wiersze 2 kolumn pasują do siebie Działa to jednak tylko dla jednego typu, ale dla mnie jest w porządku !! – DarkPh03n1X

57

Czy dtEmp na aktualna DataTable pracy:

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

To miłe.

+6

Ta odpowiedź zasługuje na więcej uwagi, była dokładnie tym, czego potrzebowałem i jest o wiele prostsza niż budowanie hashtable/dictionary/cokolwiek, o ile potrzebujesz tylko filtrować dokładne duplikaty. – lee

+0

Należy uważać na wydajność tego rozwiązania. W mojej implementacji ToTable() był dość powolny, zabierając 30 razy więcej niż pierwotne zapytanie, które dostało dane. –

+0

Ten fragment kodu jest taki, jaki chcę. Prosty i świetny. –

2

Herezje łatwy i szybki sposób za pomocą 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

Dziękujemy za zamieszczenie odpowiedzi! Pamiętaj, aby uważnie przeczytać [FAQ na temat autopromocji] (http://stackoverflow.com/faq#promotion). Należy również pamiętać, że * wymagane * jest to, że publikujesz zrzeczenie się za każdym razem, gdy łączysz się z własną witryną/produktem. Dodaję tutaj ujawnienie; spróbuj o tym pamiętać na przyszłość! –

+0

to bardzo wolno .. – LuckyS

12

Ten post dotyczy pobierania tylko Distincts wiersze z tabeli na podstawie danych z wielu kolumn.

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

Musisz wywołać tę metodę i musisz przypisać wartość do datatable. W powyższym kodzie mamy RNORFQNo, PartNo, RFQ id, ItemId, RNONo, QUANTity, NSNNO, UOMName, MOQ i opis przedmiotu jako kolumnę, na której chcemy mieć różne wartości.

+0

Dziękuję bardzo. Naprawdę pomaga :) Łatwe rozwiązanie – 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

Istnieje prosty sposób użycia metody 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

Zgaduję, że nie musisz grupować według licznika() == 1, bo inaczej otrzymasz wszystkie wiersze. –

8

prosty sposób może być:

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

całkowicie różne rzędy:

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

W odróżnieniu od danego rzędu (ów) (Zauważ, że kolumny wymienione w „distinctCulumnNames” zostaną zwrócone w Powstały DataTable):

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

W odróżnieniu od konkretnej kolumnie (zachowuje wszystkie kolumny w danej DataTable):

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

można użyć Metoda DefaultView.ToTable z DataTable, aby wykonać filtrowanie w ten sposób (dostosuj do 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 
Powiązane problemy