Я пытаюсь сравнить (значения свойств) экземпляр типа в списке и устранить дубликаты. Согласно MSDN GetHashCode() — один из способов сравнения двух объектов.
Хэш-код предназначен для эффективной вставки и поиска в коллекциях, основанных на хэш-таблице. Хэш-код не является постоянным значением
Учитывая это, я начал писать свой метод расширения, как показано ниже.
public static class Linq
{
public static IEnumerable<T> DistinctObjects<T>(this IEnumerable<T> source)
{
List<T> newList = new List<T>();
foreach (var item in source)
{
if(newList.All(x => x.GetHashCode() != item.GetHashCode()))
newList.Add(item);
}
return newList;
}
}
Это условие всегда дает мне false
, хотя данные объекта одинаковы.
newList.All(x => x.GetHashCode() != item.GetHashCode())
Наконец, я хотел бы использовать его как
MyDuplicateList.DistinctObjects().ToList();
Если сравнение всех полей объекта слишком сложно, я могу использовать его, например,
MyDuplicateList.DistinctObjects(x=>x.Id, x.Name).ToList();
Здесь я говорю сравнить только эти два поля этих объектов.
Distinct()
, которая принимает выражение для определения уникальности. Разве это не делает то, что вы хотите? - person GEEF   schedule 19.10.2016object
. - person GEEF   schedule 19.10.2016Equals
, это просто ужасная идея не переопределять такжеEquals
, так как это будет супер сбивать с толку пользователей типа, если два методаEquals
включены объект функционирует по-разному. - person Servy   schedule 19.10.2016