43

データテーブルから重複するエントリを削除する最良の方法は何ですか?

4

11 に答える 11

96

dtEmp現在動作しているDataTableで実行します。

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

いいね。

于 2013-02-01T10:56:40.473 に答える
81

重複を削除する

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

于 2010-12-11T06:34:34.697 に答える
23

簡単な方法は次のとおりです。

 var newDt= dt.AsEnumerable()
                 .GroupBy(x => x.Field<int>("ColumnName"))
                 .Select(y => y.First())
                 .CopyToDataTable();
于 2016-11-23T06:53:26.340 に答える
16

この投稿は、複数の列に基づいてデータテーブルから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が、個別の値が必要な列としてあります。

于 2013-03-13T10:51:02.697 に答える
6

これが簡単で速い方法です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;
}
于 2013-03-07T06:33:35.493 に答える
3

LinqGroupByメソッドを使用する簡単な方法があります。

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);
于 2013-09-20T05:41:43.507 に答える
2
    /* 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();
        }
    }
于 2013-03-20T11:14:39.710 に答える
2

完全に異なる行:

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

特定の列で区別する(指定されたDataTableのすべての列を保持します):

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();
    }
}
于 2018-01-19T13:40:21.507 に答える
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
于 2018-01-19T18:55:29.260 に答える
0

すべてのデータテーブル列を区別するために、文字列配列内の列の名前を簡単に取得できます

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

お気づきのように、DataTableクラスの拡張機能として使用することを考えました

于 2019-07-12T08:34:39.030 に答える
0

これはDefaultView.ToTableおよびforeachループよりも高速で重複を削除するため、これをお勧めします。これを使用して、複数の列でgroupbyを使用することもできます。

DataTable distinctDT = (from rows in dt.AsEnumerable() 
group rows by new { ColA = rows["ColA"], ColB = rows["ColB"]} into grp
select grp.First()).CopyToDataTable();
于 2021-03-02T17:46:15.717 に答える