Удалите дубликаты из DataTable и пользовательского IEqualityComparer<DataRow>.

StackOverflow https://stackoverflow.com/questions/1599466

Вопрос

Как мне реализовать 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top