2010-12-11 2 views

ответ

63

Удалить Дубликаты

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

Вот ссылки ниже

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

Для удаления дубликатов в колонке

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

+0

: Как это сделать для нескольких столбцов. Я попытался включить string [] colName.But Table.Rows.Remove (dRow); выдает ошибку, например: «Данный DataRow не находится в текущем DataRowCollection». Пожалуйста, предложите. – user1495475

+0

Вам нужно будет модифицировать foreach постепенно на более высоких уровнях. Однако использование Linq может быть проще. http://stackoverflow.com/questions/8939516/how-to-find-duplicate-record-using-linq-from-datatable – miracules

+0

Ссылка от dotnetspark работала для меня, потому что мне нужно было удалять строки только в том случае, если строки из двух столбцов совпадают . Однако это работает только для одного типа, но это нормально для меня! – DarkPh03n1X

57

dtEmp ли на ваш текущий рабочий DataTable:

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

Это хорошо.

+6

Этот ответ заслуживает большего внимания, было именно то, что мне было нужно, и было проще, чем создание хэш-таблицы/словаря/независимо от того, пока вам нужно только фильтровать точные дубликаты. – lee

+0

Будьте осторожны с производительностью этого решения. В моей реализации ToTable() был довольно медленным, в 30 раз дольше, чем исходный запрос, который получил данные. –

+0

Этот фрагмент кода - это то, что я хочу. Просто и отлично. –

2

Heres простой и быстрый способ использования 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

Спасибо за сообщение! Обязательно внимательно прочитайте [FAQ по самопомощи] (http://stackoverflow.com/faq#promotion). Также обратите внимание, что * требуется *, что вы публикуете отказ от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт/продукт. Я добавляю раскрытие для вас здесь; старайтесь держать это в уме на будущее! –

+0

это очень медленно .. – LuckyS

12

Этот пост о выборке только Distincts строк из таблицы данных на основе нескольких столбцов.

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

Этот метод необходимо вызвать, и вам необходимо присвоить значение для datatable. В вышеприведенном коде мы имеем RNORFQNo, PartNo, RFQ id, ItemId, RNONo, Quantity, NSNNO, UOMName, MOQ и Item Description в качестве столбца, на котором мы хотим отличные значения.

+0

Большое вам спасибо. Действительно помогает :) Простое решение – 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

Существует простой способ использования Linq GroupBy Method.

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

Я думаю, вам не нужно группировать по count() == 1, или вы все равно получите все строки. –

8

простым способом было бы:

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

Полностью отдельные строки:

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

В отличие от конкретной строки (ами) (Обратите внимание, что столбцы, указанные в "distinctCulumnNames" будут возвращены в результате DataTable):

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

Distinct по определенному столбцу (сохраняет все столбцы в данной 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

Вы можете использовать Метод DefaultView.ToTable для DataTable для такой фильтрации (приспосабливайтесь к 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 

 Смежные вопросы

  • Нет связанных вопросов^_^