Каков наилучший способ удаления повторяющихся записей из таблицы данных?
Лучший способ удалить повторяющиеся записи из таблицы данных
Ответ 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();
Ответ 5
Существует простой способ использования метода 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);
Ответ 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;
}
ЩЕЛКНИТЕ, чтобы посетить мой блог для более подробной информации
Ответ 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