Проверка на наличие дубликатов в сложном объекте с помощью Linq или лямбда-выражения

StackOverflow https://stackoverflow.com/questions/223400

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

  • Распакуйте иерархию
  • Проецируйте каждый элемент на его свойство 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()

Другие советы

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

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

var results = from item in list
              group item by item.id into g
              select g.First();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top