GroupBy
und ToLookUp
hat fast die gleiche Funktionalität, AUSSER dies: Referenz
GroupBy: Der GroupBy-Operator gibt Elementgruppen basierend auf einem Schlüsselwert zurück. Jede Gruppe wird durch ein IGrouping-Objekt dargestellt.
ToLookup: ToLookup ist dasselbe wie GroupBy. Der einzige Unterschied besteht darin, dass die Ausführung von GroupBy verzögert wird, während die Ausführung von ToLookup sofort erfolgt.
Lassen Sie uns den Unterschied anhand des Beispielcodes beseitigen. Angenommen, wir haben eine Klasse, die das Person
Modell darstellt:
class Personnel
{
public int Id { get; set; }
public string FullName { get; set; }
public int Level { get; set; }
}
Danach definieren wir eine Liste von personnels
wie folgt:
var personnels = new List<Personnel>
{
new Personnel { Id = 1, FullName = "P1", Level = 1 },
new Personnel { Id = 2, FullName = "P2", Level = 2 },
new Personnel { Id = 3, FullName = "P3", Level = 1 },
new Personnel { Id = 4, FullName = "P4", Level = 1 },
new Personnel { Id = 5, FullName = "P5", Level =2 },
new Personnel { Id = 6, FullName = "P6", Level = 2 },
new Personnel { Id = 7, FullName = "P7", Level = 2 }
};
Jetzt muss ich die nach personnels
ihrem Level gruppieren. Ich habe hier zwei Ansätze. mit GroupBy
oder ToLookUp
. Wenn ich GroupBy
, wie bereits erwähnt, die verzögerte Ausführung verwende, bedeutet dies, dass beim Durchlaufen der Sammlung das nächste Element möglicherweise berechnet wird oder nicht, bis es angefordert wird.
var groups = personnels.GroupBy(p => p.Level);
personnels.RemoveAll(p => p.Level == 1);
foreach (var product in groups)
{
Console.WriteLine(product.Key);
foreach (var item in product)
Console.WriteLine(item.Id + " >>> " + item.FullName + " >>> " + item.Level);
}
Im obigen Code habe ich zuerst die gruppiert personnels
, aber bevor ich sie iterierte, habe ich einige entfernt personnels
. Da GroupBy
die verzögerte Ausführung verwendet wird, enthält das Endergebnis nicht die entfernten Elemente, da die Gruppierung in der berechnet wirdforeach
Stelle berechnet wird.
Ausgabe:
2
2 >>> P2 >>> 2
5 >>> P5 >>> 2
6 >>> P6 >>> 2
7 >>> P7 >>> 2
Aber wenn ich den obigen Code wie folgt umschreibe: (Beachten Sie, dass der Code mit dem vorherigen Code identisch GroupBy
ist, außer dass er durch ersetzt wird. ToLookUp
)
var groups = personnels.ToLookup(p => p.Level);
personnels.RemoveAll(p => p.Level == 1);
foreach (var product in groups)
{
Console.WriteLine(product.Key);
foreach (var item in product)
Console.WriteLine(item.Id + " >>> " + item.FullName + " >>> " + item.Level);
}
Wenn ToLookUp
die ToLookUp
Methode sofort ausgeführt wird, bedeutet dies, dass beim Aufrufen der Methode ein Ergebnis generiert und eine Gruppe angewendet wird. Wenn ich also ein Element aus entfernepersonnels
vor der Iteration Auswirkungen auf das Endergebnis.
Ausgabe:
1
1 >>> P1 >>> 1
3 >>> P3 >>> 1
4 >>> P4 >>> 1
2
2 >>> P2 >>> 2
5 >>> P5 >>> 2
6 >>> P6 >>> 2
7 >>> P7 >>> 2
Hinweis: GroupBy
undToLookUp
beide geben auch unterschiedliche Typen zurück.
Sie können ToDictionary anstelle von ToLookUp verwenden, müssen jedoch Folgendes beachten: ( Referenz )
Die Verwendung von ToLookup () ist der von ToDictionary () sehr ähnlich. Mit beiden können Sie Schlüsselauswahl, Wertauswahl und Vergleicher angeben. Der Hauptunterschied besteht darin, dass ToLookup () die doppelten Schlüssel zulässt (und erwartet), ToDictionary () jedoch nicht