Подтвердить что ты не робот

Удаление дубликатов в списке с помощью linq

Предположим, что у вас есть список MyObject, например:

public class MyObject
{
  public int ObjectID {get;set;}
  public string Prop1 {get;set;}
}

Как удалить дубликаты из списка, где может быть несколько экземпляров объектов с тем же ObjectID.

Спасибо.

4b9b3361

Ответ 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())