Удалите дубликаты из DataTable и пользовательского IEqualityComparer<DataRow>.
-
22-09-2019 - |
Вопрос
Как мне реализовать IEqualityComparer<DataRow>
удалить повторяющиеся строки из DataTable
со следующей структурой:
ID primary key, col_1, col_2, col_3, col_4
Компаратор по умолчанию не работает, поскольку каждая строка имеет свой собственный уникальный первичный ключ.
Как реализовать IEqualityComparer<DataRow>
это пропустит первичный ключ и сравнит только оставшиеся данные.
У меня есть что-то вроде этого:
public class DataRowComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
return
x.ItemArray.Except(new object[] { x[x.Table.PrimaryKey[0].ColumnName] }) ==
y.ItemArray.Except(new object[] { y[y.Table.PrimaryKey[0].ColumnName] });
}
public int GetHashCode(DataRow obj)
{
return obj.ToString().GetHashCode();
}
}
и
public static DataTable RemoveDuplicates(this DataTable table)
{
return
(table.Rows.Count > 0) ?
table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
table;
}
но он вызывает только GetHashCode()
и не звонит Equals()
Решение
Вот так Distinct
работает.Интенционально он использует GetHashCode
метод.Вы можете написать GetHashCode
делать то, что тебе нужно.Что-то вроде
public int GetHashCode(DataRow obj)
{
var values = obj.ItemArray.Except(new object[] { obj[obj.Table.PrimaryKey[0].ColumnName] });
int hash = 0;
foreach (var value in values)
{
hash = (hash * 397) ^ value.GetHashCode();
}
return hash;
}
Поскольку вы лучше знаете свои данные, вы, вероятно, сможете придумать лучший способ генерации хеша.
Не связан с StackOverflow