Wir gruppieren oft nach einem oder mehreren einzelnen Attributen in einer Speichersammlung, wie z. B. Liste, und zeigen Statistiken an. Der einfachste Weg, sich das vorzustellen, besteht darin, die List-Instanz basierend auf einem bestimmten Schlüsselattribut zu durchlaufen und sie in den folgenden Wörterbuchtyp umzuwandeln:
Dictionary<string, List<MyObject>
Zum Beispiel gegebene Autos,
List<Car> cars = new List<Car>(){ new Car(1,"audiA6","private"), new Car(2,"futon","merchant"), new Car(3,"feiren","bike"), new Car(4,"bukon","private"), new Car(5,"baoma","private"), new Car(6,"dayun","merchant") };
Ich möchte id als Schlüssel und den Wert Car verwenden, der in ein Wörterbuch idCarDict konvertiert wird. Zusätzlich zum Durchlaufen dieser Methode, die die komplizierteste Logik aufweist und den meisten Code erfordert, können wir auch direkt die ToDictionary-Methode verwenden.
ar idCarDict = cars.ToDictionary(car=>car.id);
Diese Methode ist jedoch eingeschränkt, es kann nur eine Instanz des -Objekts geben, das dem Schlüsselcode entspricht, d. h. der zurückgegebene Typ ist
Dictionary<string,Object>
Das ist schlecht, da ein Schlüsselcode mehreren Instanzen entsprechen kann. Zu diesem Zeitpunkt müssen Sie GroupBy zuerst zum Gruppieren nach Schlüsselcode verwenden und ihn dann in ein Wörterbuch konvertieren.
Zum Beispiel möchten wir den Typ als Schlüssel verwenden, um mehrere Autos unter diesem Modell zu erhalten
Dictionary<string, List<Car>> typeCarDict = cars.GroupBy(car => car.type). ToDictionary(g => g.Key, g => g.ToList());
Dieser Konvertierungscode ist einfach und viel besser als die folgende Durchlauflogik!
var dict = new Dictionary<string,List<Car>>();foreach(var car in cars) { if(dict.Contains(car.type)) dict[car.type].Add(car); else dict.Add(car.type,new List<Car>(){car}));}
Dies löst das Problem, dass ein Schlüsselcode mehreren Instanzen entspricht. Kann dies dann entsprechend dem Problem mehrerer Schlüsselcodes, die mehreren Instanzen entsprechen, mithilfe von GroupBy auf der Liste erreicht werden? Kann nicht erreicht werden.
Zu diesem Zeitpunkt müssen Sie eine Linq-Anweisung schreiben, um mehrere Schlüsselcodes zu einem neuen Objekt zu kombinieren.
new {key1, key2, ...}
Als Beispiel haben wir einen solchen Satz Set sind ValPair-Objekte, dieses Objekt enthält zwei ganzzahlige Elemente, Val1 ist das kleinere und Val2 ist relativ größer. Wie gruppiere ich nach der Kombination von Val1 und Val2?
Bitte beachten Sie die folgende Logik:
static void printfDuplicateCompare(List<ValPair> compares) { //按组合键分组后,每组元素个数大于2的分组,按降序排序 var rtnByVal1 = from item in compares group item by new { item.Val1, item.Val2 } into g where g.Count()>1 orderby g.Count() descending select g; //按Val1和Val2组合为字典键,元素个数为值 var dict = rtnByVal1.ToDictionary(g => g.Key,g=>g.Count()); }
Zusammenfassung
Listengruppen können nur nach einem Schlüssel gruppiert werden. Wenn Sie nach mehreren Tastenkombinationen gruppieren müssen, müssen Sie einen schreiben Linq-Anweisungskombination.
Das obige ist der detaillierte Inhalt von.NET Framework – Detaillierte Erläuterung des „Gruppierens' von technischem Code in Sammlungen und LINQ. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!