Подтвердить что ты не робот

Лучший способ удалить повторяющиеся записи из таблицы данных

Каков наилучший способ удаления повторяющихся записей из таблицы данных?

4b9b3361

Ответ 1

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

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

Ответ 2

Сделайте dtEmp в текущей рабочей таблице данных:

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

Это приятно.

Ответ 3

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

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 в качестве столбца, на котором мы хотим отличные значения.

Ответ 4

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

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

Ответ 7

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

Ответ 8

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

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

Различаются по отдельным строкам (обратите внимание, что столбцы, упомянутые в "DifferentCulumnNames", будут возвращены в результирующей 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();
    }
}

Ответ 9

Вы можете использовать метод DefaultView.ToTable объекта DataTable, чтобы выполнить фильтрацию следующим образом (адаптироваться к С#):

 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

Ответ 10

Чтобы различать все датируемые столбцы, вы можете легко получить имена столбцов в строковом массиве.

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