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

Как получить отдельный список из списка объектов?

У меня есть List<MyClass> someList.

class MyClass
{
    public int Prop1...
    public int Prop2...
    public int Prop3...
}

Я хотел бы знать, как получить новый отличный List<MyClass> distinctList от List<MyClass> someList, но только сравнивая его с Prop2.

4b9b3361

Ответ 1

К сожалению, нет никакой простой встроенной поддержки для этого в рамках, но вы можете использовать DistinctBy, который у меня есть MoreLINQ.

Вы должны использовать:

var distinctList = someList.DistinctBy(x => x.Prop2).ToList();

(Вы можете использовать только реализацию DistinctBy. Если вы предпочитаете использовать реализацию Microsoft, я считаю, что там есть нечто подобное в System.Interactive assembly Активные расширения.)

Ответ 2

Вы можете эмулировать эффект DistinctBy с помощью GroupBy, а затем просто использовать первую запись в каждой группе. Может быть, немного медленнее, чем другие реализации.

someList.GroupBy(elem=>elem.Prop2).Select(group=>group.First());

Ответ 3

вам нужно использовать метод расширения .Distinct(..);. Вот пример:

public class Comparer : IEqualityComparer<Point>
    {
        public bool Equals(Point x, Point y)
        {
            return x.X == y.X;
        }

        public int GetHashCode(Point obj)
        {
            return (int)obj.X;
        }
    }

Не забывайте о GetHashCode.

Использование:

List<Point> p = new List<Point>();
// add items
p.Distinct(new Comparer());

Ответ 4

Переопределить Equals (объект obj) и методы GetHashCode():

class MyClass
{
    public int Prop1 { get; set; }
    public int Prop2 { get; set; }
    public int Prop3 { get; set; }

    public override bool Equals(object obj)
    {
        return ((MyClass)obj).Prop2 == Prop2;
    }
    public override int GetHashCode()
    {
        return Prop2.GetHashCode();
    }
}

а затем просто вызовите:

List<MyClass> distinctList = someList.Distinct().ToList();

Ответ 5

Создайте класс, который реализует интерфейс IEqualityComparer, который проверяет только ваш Prop2-Property. Затем вы можете передать экземпляр этого класса методу Distinct extension.