Проверка на наличие дубликатов в сложном объекте с использованием выражения Linq или Lambda - PullRequest
4 голосов
/ 22 октября 2008

Я только начал изучать выражения linq и lambda, и они, кажется, хорошо подходят для поиска дубликатов в коллекции сложных объектов, но я немного запутался и надеюсь, что кто-то может помочь мне вернуться на путь к счастливому кодированию.

Мой объект структурирован как list.list.uniqueCustomerIdentifier

Мне нужно убедиться, что во всем сложном объекте нет дубликатов uniqueCustomerIdentifier с ним. Если есть дубликаты, мне нужно определить, какие дубликаты, и вернуть список дубликатов.

Ответы [ 3 ]

9 голосов
/ 22 октября 2008
  • Распаковать иерархию
  • Проецируйте каждый элемент на его свойство uniqueID
  • Сгруппируйте эти идентификаторы
  • Фильтрация групп по группам, которые имеют более 1 элемента
  • Проецировать каждую группу на ключ группы (обратно к uniqueID)
  • Перечислить запрос и сохранить результат в виде списка.

var result = 
  myList
    .SelectMany(x => x.InnerList)
    .Select(y => y.uniqueCustomerIdentifier)
    .GroupBy(id => id)
    .Where(g => g.Skip(1).Any())
    .Select(g => g.Key)
    .ToList()
2 голосов
/ 22 октября 2008

Существует оператор linq Distinct (), который позволяет фильтровать отдельные записи, если вам нужны только идентификаторы. Если вы настроили свой класс для переопределения равных вам или у вас есть IEqualityComparer , вы можете напрямую вызвать метод расширения Distinct, чтобы получить уникальные результаты из списка. В качестве дополнительного бонуса вы также можете использовать методы Union и Intersect для объединения или фильтрации между двумя списками.

Другой вариант - сгруппировать по идентификатору, а затем выбрать первый элемент.

var results = from item in list
              group item by item.id into g
              select g.First();
0 голосов
/ 22 октября 2008

Если вы хотите сгладить две иерархии списка, используйте метод SelectMany, чтобы сгладить IEnumerable<IEnumerable<T>> в IEnumerable<T>.

...