2016-08-04 4 views
2

У меня есть список объектов. Объекты имеют имя. Как я могу найти два объекта в списке с тем же именем. Теперь я пишу все имена объектов в цикле foreach в список строк, а затем проверяю их. Есть ли способ проверить одинаковые имена объектов, не записывая их в список строк, чтобы проверить этот список? мой код выглядит следующим образом:Список объектов. Найти два объекта с тем же именем

List<string> objectnames = new List<string>(); 

foreach (object obj in DBobjects) 
{ 
    objectnames.Add(obj.name); 
} 

var doublicates = objectnames.GroupBy(x => x).Where(x => x.Count() > 1).Select(x => x.Key); 

if(doublicates.Any()) 
{ 
    foreach(string name in doublicates) 
    { 
     //do something with each dublicate 
    } 
} 
+5

'DBobjects.GroupBy (OBJ => obj.name)'? – zerkms

+3

Мне нравится слово «двойное», мне жаль, что это не слово! – DavidG

ответ

1

Вы можете непосредственно использовать это в вашем первоначальном списке:

var doublicates = DBobjects.GroupBy(x => x.name) 
          .Where(x => x.Count() > 1) 
          .Select(x => new { Name = x.Key, objs = x.ToList() }); 

foreach(var duplicate in doublicates) 
{ 
    // do something with duplicate.Name and duplicate.objs 
} 
+0

отлично работает - спасибо – OHA

6

Почему вы не просто группа Ваш DBobjects:

var allDuplicates = DBobjects.GroupBy(o => o.name).Where(g => g.Count() > 1); 

Если вам нравится, что вы можете преобразовать это в преобразование словаря из name в список объектов с таким именем:

var dict = allDuplicates.ToDictionary(g => g.Key, g => g.ToList()); 

Теперь, например, вы можете перечислить все дубликаты:

foreach(string name in dict.Keys) 
{ 
    Console.WriteLine($"There are {dict[name].Count} entries with name {name}:"); 
    foreach(var o in dict[name]) 
     Console.Write(" " + o.ToString()); 
} 
Смежные вопросы