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