Проверка на наличие дубликатов в сложном объекте с помощью Linq или лямбда-выражения
-
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>
.