Heim  >  Artikel  >  Backend-Entwicklung  >  .NET Framework – Detaillierte Erläuterung des „Gruppierens“ von technischem Code in Sammlungen und LINQ

.NET Framework – Detaillierte Erläuterung des „Gruppierens“ von technischem Code in Sammlungen und LINQ

黄舟
黄舟Original
2017-03-18 13:13:281535Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn