Определить, равны ли два или более объектов в списке по некоторому свойству - PullRequest
3 голосов
/ 29 января 2010

Скажите, у меня есть список List<MyObject> myObjectList. У объекта MyObject есть свойство с именем Order, которое имеет тип int. Как определить, имеют ли два или более объектов в myObjectList одинаковые Order, используя LINQ-to-objects?

Ответы [ 5 ]

11 голосов
/ 29 января 2010

Сначала GroupBy MyObject.Order, а затем определите, есть ли в Any групп более одного члена:

bool b = myObjectList.GroupBy(x => x.Order)
                     .Any(g => g.Count() > 1);
// b is true is there are at least two objects with the same Order
// b is false otherwise
2 голосов
/ 29 января 2010
bool hasDuplicates = myObjectList.Count >
    new HashSet<int>(myObjectList.Select(x => x.Order)).Count;
1 голос
/ 29 января 2010

А как же Distinct?

bool allUnique = ordersList.Count == ordersList.Select(o => o.Order).Distinct().Count()
1 голос
/ 29 января 2010

Не просто решение Linq-To-Objects, но как насчет:

var ordersList = new List<Order>(myObjectList.Select(obj => obj.Order);
bool allUnique = ordersList.Count == new HashSet<Order>(ordersList).Count;

Нужно было бы проверить производительность всех подходов, представленных здесь. Я был бы осторожен, в противном случае вы быстро получите несколько медленных поисков O (n²).

0 голосов
/ 29 января 2010

Метод Count() принимает предикат, поэтому вы должны сделать что-то вроде этого:

if(myObjectList.Count(x => x.Order == 1) >= 2)
{
    // Do something
}
...