Удаление дубликатов в списке с помощью linq
Предположим, что у вас есть список MyObject, например:
public class MyObject
{
public int ObjectID {get;set;}
public string Prop1 {get;set;}
}
Как удалить дубликаты из списка, где может быть несколько экземпляров объектов с тем же ObjectID.
Спасибо.
Ответы
Ответ 1
Вы можете использовать GroupBy()
и выбрать первый элемент каждой группы для достижения того, что вы хотите - при условии, что вы хотите выбрать один элемент для каждого отдельного свойства ObjectId
:
var distinctList = myList.GroupBy(x => x.ObjectID)
.Select(g => g.First())
.ToList();
В качестве альтернативы также существует DistinctBy()
в MoreLinq project, который позволит использовать более сжатый синтаксис (но будет добавлять зависимость от вашего проект):
var distinctList = myList.DistinctBy( x => x.ObjectID).ToList();
Ответ 2
Вы можете сделать это, используя метод Distinct()
. Но поскольку этот метод использует сопоставитель по умолчанию, ваш класс должен реализовать IEquatable<MyObject>
следующим образом:
public class MyObject : IEquatable<MyObject>
{
public int ObjectID {get;set;}
public string Prop1 {get;set;}
public bool Equals(MyObject other)
{
if (other == null) return false;
else return this.ObjectID.Equals(other.ObjectID);
}
public override int GetHashCode()
{
return this.ObjectID.GetHashCode();
}
}
Теперь вы можете использовать метод Distinct()
:
List<MyObject> myList = new List<MyObject>();
myList.Add(new MyObject { ObjectID = 1, Prop1 = "Something" });
myList.Add(new MyObject { ObjectID = 2, Prop1 = "Another thing" });
myList.Add(new MyObject { ObjectID = 3, Prop1 = "Yet another thing" });
myList.Add(new MyObject { ObjectID = 1, Prop1 = "Something" });
var duplicatesRemoved = myList.Distinct().ToList();
Ответ 3
Вы можете создать собственный сопоставитель объектов, реализовав интерфейс IEqualityComparer:
public class MyObject
{
public int Number { get; set; }
}
public class MyObjectComparer : IEqualityComparer<MyObject>
{
public bool Equals(MyObject x, MyObject y)
{
return x.Id == y.Id;
}
public int GetHashCode(MyObject obj)
{
return obj.Id.GetHashCode();
}
}
Тогда просто:
myList.Distinct(new MyObjectComparer())