Как искать дубликаты в списке Enumerable, проверяя определенные свойства - PullRequest
0 голосов
/ 09 января 2019

У меня есть список объектов Enumerable.

Объект обладает следующими свойствами: -Я БЫ -Название -Тип

Я хотел бы собрать идентификаторы тех объектов, которые имеют одинаковое имя и тип в списке.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Чтобы найти дубликаты (основанные на двух полях - Name and Type) в коллекции и извлечь поле thid (ID), необходимо начать с разбивки проблем на части.

1) Найти дубликаты

  • Ключевые поля GroupBy, (Имя и Тип)

list.GroupBy(x=>new{x.Name,x.Type})

  • Группы фильтров, в которых более 1 элемента

list.GroupBy(x=>new{x.Name,x.Type}).Where(x=>x.Count()>1)

2) Выберите идентификаторы

  • Свести группы

list.GroupBy(x=>new{x.Name,x.Type}) .Where(x=>x.Count()>1) .SelectMany(x=>x.ToList())

  • Выберите идентификаторы

    list.GroupBy(x=>new{x.Name,x.Type}) .Where(x=>x.Count()>1) .SelectMany(x=>x.ToList()).Select(x=>x.ID)

Собираем все вместе, например,

   var list = new List<CustomObject>
    {
        new CustomObject{ID=1, Name="Abc",Type="Type1"},
        new CustomObject{ID=2, Name="Def",Type="Type2"},
        new CustomObject{ID=3, Name="Abc",Type="Type1"},
        new CustomObject{ID=4, Name="Abc",Type="Type2"},
        new CustomObject{ID=5, Name="Def",Type="Type2"},
        new CustomObject{ID=6, Name="Def",Type="Type1"},
    };

    var result = list.GroupBy(x=>new{x.Name,x.Type})
                     .Where(x=>x.Count()>1)
                     .SelectMany(x=>x.ToList()).Select(x=>x.ID);

Вывод для приведенного выше примера

1 
3 
2 
5 
0 голосов
/ 09 января 2019

Используйте Linq и group для группировки всех объектов по имени и типу, а затем выбирайте только объекты с количеством> 1.

var group = from myObject o in myObjects
           group new { p.Name, p.Type } into grp
           select new { Name = grp.Key.Name, Type = grp.Key.Type, Count = grp.Count() };

var dups = group.Where(g=>g.Count >1);
0 голосов
/ 09 января 2019

Использовать Linq .GroupBy() Это создаст список списков, где каждый список организован по ключу.

list.GroupBy(e => new { e.Name, e.Type })

...