Каков наилучший способ удаления повторяющихся записей из таблицы данных?Лучший способ удалить повторяющиеся записи из таблицы данных
ответ
Удалить Дубликаты
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
: Как это сделать для нескольких столбцов. Я попытался включить string [] colName.But Table.Rows.Remove (dRow); выдает ошибку, например: «Данный DataRow не находится в текущем DataRowCollection». Пожалуйста, предложите. – user1495475
Вам нужно будет модифицировать foreach постепенно на более высоких уровнях. Однако использование Linq может быть проще. http://stackoverflow.com/questions/8939516/how-to-find-duplicate-record-using-linq-from-datatable – miracules
Ссылка от dotnetspark работала для меня, потому что мне нужно было удалять строки только в том случае, если строки из двух столбцов совпадают . Однако это работает только для одного типа, но это нормально для меня! – DarkPh03n1X
dtEmp
ли на ваш текущий рабочий DataTable:
DataTable distinctTable = dtEmp.DefaultView.ToTable(/*distinct*/ true);
Это хорошо.
Этот ответ заслуживает большего внимания, было именно то, что мне было нужно, и было проще, чем создание хэш-таблицы/словаря/независимо от того, пока вам нужно только фильтровать точные дубликаты. – lee
Будьте осторожны с производительностью этого решения. В моей реализации ToTable() был довольно медленным, в 30 раз дольше, чем исходный запрос, который получил данные. –
Этот фрагмент кода - это то, что я хочу. Просто и отлично. –
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;
}
Спасибо за сообщение! Обязательно внимательно прочитайте [FAQ по самопомощи] (http://stackoverflow.com/faq#promotion). Также обратите внимание, что * требуется *, что вы публикуете отказ от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт/продукт. Я добавляю раскрытие для вас здесь; старайтесь держать это в уме на будущее! –
это очень медленно .. – LuckyS
Этот пост о выборке только 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 в качестве столбца, на котором мы хотим отличные значения.
Большое вам спасибо. Действительно помогает :) Простое решение – Rebecca
/* 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();
}
}
Существует простой способ использования 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);
Я думаю, вам не нужно группировать по count() == 1, или вы все равно получите все строки. –
простым способом было бы:
var newDt= dt.AsEnumerable()
.GroupBy(x => x.Field<int>("ColumnName"))
.Select(y => y.First())
.CopyToDataTable();
Полностью отдельные строки:
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();
}
}
Вы можете использовать Метод 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
Ненависть, чтобы снова отправить ответ. Также см. Http: // stackoverflow.com/a/24387929/815600 – Sandy