Как получить отдельный список из списка объектов?
У меня есть List<MyClass> someList
.
class MyClass
{
public int Prop1...
public int Prop2...
public int Prop3...
}
Я хотел бы знать, как получить новый отличный List<MyClass> distinctList
от List<MyClass> someList
, но только сравнивая его с Prop2
.
Ответы
Ответ 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.