2016-08-04 5 views
2

Ich habe eine Liste von Objekten. Die Objekte haben einen Namen. Wie finde ich zwei Objekte in der Liste mit demselben Namen? Nun schreibe ich alle Objektnamen in einer foreach-Schleife in eine Liste von Strings und überprüfe sie dann. gibt es eine Möglichkeit, gleiche Namen von Objekten zu überprüfen, ohne sie in eine Liste von Strings zu schreiben, um diese Liste zu überprüfen? so aussehen mein Code wie folgt aus:Liste der Objekte. Finden Sie zwei Objekte mit dem gleichen Namen

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

Ich liebe das Wort "double", ich wünschte, es wäre ein echtes Wort! – DavidG

Antwort

1

Sie können das direkt auf Ihrer ursprünglichen Liste verwenden:

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

funktioniert gut - danke – OHA

6

Warum Sie nicht nur Ihre Gruppe DBobjects:

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

Wenn Sie möchten, dass Sie dies in ein Wörterbuch-Mapping von name zu einer Liste der Objekte mit diesem Namen konvertieren können:

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

Jetzt zum Beispiel können Sie alle Duplikate Liste:

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()); 
} 
Verwandte Themen