Удаление дублирующихся объектов в списке (C #) - PullRequest
18 голосов
/ 29 ноября 2011

Итак, я понимаю, как удалить дубликаты в списке, когда дело доходит до строк, int и т. Д., Используя Distinct() из Linq.Но как удалить дубликаты, основанные на определенном атрибуте объекта?

Например, у меня есть класс TimeMetric.Этот класс TimeMetric имеет два атрибута: MetricText и MetricTime.У меня есть список TimeMetrics, который называется MetricList.Я хочу удалить все дубликаты TimeMetric с тем же атрибутом MetricText.Значение TimeMetric может быть одинаковым, но если любой TimeMetric имеет такой же MetricText, его необходимо дублировать.

Ответы [ 3 ]

21 голосов
/ 29 ноября 2011

Вам необходимо использовать вторую перегрузку Distinct, которая принимает экземпляр IEqualityComparer<TimeMetric> в качестве второго параметра. Определите компаратор следующим образом:

class MyComparer : IEqualityComparer<TimeMetric>
{
    public bool Equals(TimeMetric x, TimeMetric y)
    {
        return x.MetricText.Equals(y.MetricText);
    }

    public int GetHashCode(TimeMetric obj)
    {
        return obj.MetricText.GetHashCode();
    }
}

Важное примечание: Приведенный выше код не проверяет случай, когда свойство MetricText имеет значение null (и звучит так, как может, поскольку, скорее всего, string) Вы должны сделать это и вернуть 0 из GetHashCode, если MetricText равно null. С другой стороны, если тип MetricText является типом значения, вам не нужно выполнять никаких изменений.

А потом:

var list = new List<TimeMetric> { ... };
var unique = list.Distinct(new MyComparer());
14 голосов
/ 29 ноября 2011

Используйте linq:

var list = list 
    .GroupBy(i => i.MetricText)
    .Select(g => g.First())
    .ToList();

Или передайте компаратор, который использует свойство:

public class mtCompare : IEqualityComparer<TimeMetric>
{
  public bool Equals(TimeMetric x, TimeMetric y)
  {
    return Equals(x.MetricText, y.MetricText);
  }

  public int GetHashCode(TimeMetric obj)
  {
    return obj.MetricText.GetHashCode();
  }
}

....

list.Distinct(new mtCompare());
3 голосов
/ 29 ноября 2011

Вы можете использовать Отличительная перегрузка с IEqualityComparer .

Ваш метод equals для вашей реализации IEqualityComparer будет выглядеть так:

bool Equals(TimeMetric x, TimeMetric y)
{
  return x.MetricText.Equals(y.MetricText);
}
...