2016-08-04 38 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()); 
}