2010-12-11 107 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

:我怎麼能做到多列。我試過包括字符串[] colName.But Table.Rows.Remove(dRow);拋出錯誤,如「給定的DataRow不在當前DataRowCollection中」。請建議。 – user1495475 2012-10-17 12:05:56

+0

您將不得不在更多級別上逐步修改foreach。但是,使用Linq可能會更容易。 http://stackoverflow.com/questions/8939516/how-to-find-duplicate-record-using-linq-from-datatable – miracules 2013-04-18 08:50:01

+0

來自dotnetspark的鏈接爲我工作,因爲我只需要刪除行,如果2列的行匹配。但這隻適用於一種類型,但對我來說這很好! – DarkPh03n1X 2015-11-11 18:20:39

57

dtEmp在當前工作的DataTable:

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

很高興。

+6

這個答案值得更多的關注,正是我所需要的和比構建一個哈希表/字典/任何只要你只需要過濾確切的重複更簡單。 – lee 2014-07-23 06:20:56

+0

請注意此解決方案的性能。在我的實現ToTable()很慢,比獲取數據的原始查詢長30倍。 – 2015-06-02 18:17:37

+0

這段代碼就是我想要的。簡單而好用。 – 2016-02-07 07:54:59

2

使用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

感謝您發佈您的答案!請務必仔細閱讀[自助推廣常見問題](http://stackoverflow.com/faq#promotion)。另請注意,每次鏈接到您自己的網站/產品時,您都必須*發佈免責聲明。我在這裏爲你添加披露信息;試着爲未來記住這一點! – 2013-03-07 10:01:58

+0

這很慢.. – LuckyS 2015-07-13 12:32:39

12

這篇文章是關於多個列的基礎上只讀取數據,從表Distincts行繼承人方便,快捷的方式。

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

您需要調用此方法,並且需要爲數據表賦值。 在上面的代碼中,我們將RNORFQNo,PartNo,RFQ id,ItemId,RNONo,QUantity,NSNNO,UOMName,MOQ和項目描述作爲Column列出,我們希望獲得不同的值。

+0

非常感謝。真的有助於:)簡單的解決方案 – Rebecca 2016-06-09 21:37:24

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方法的簡單方法。

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來分組,否則你將得到所有的行。 – 2014-09-06 15:54:13

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

通過特定的列中不同(保持在給定的數據表中的所有列):

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

可以使用一個DataTable的DefaultView.ToTable方法來做這樣的過濾(適應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 
相關問題