Ich versuche, LINQ zu verwenden, um ein Dictionary<string, List<CustomObject>>
aus einem zu erstellen List<CustomObject>
. Ich kann dies mit "var" zum Laufen bringen, aber ich möchte keine anonymen Typen verwenden. Hier ist was ich habe
var x = (from CustomObject o in ListOfCustomObjects
group o by o.PropertyName into t
select t.ToList());
Ich habe auch versucht, Cast<>()
die LINQ-Bibliothek zu verwenden, sobald ich sie habe x
, aber ich bekomme Kompilierungsprobleme, die dazu führen, dass es sich um eine ungültige Besetzung handelt.
linq
dictionary
Atari2600
quelle
quelle
var
kein "anonymer" Typ verwendet, sondern ein "impliziter" Typ. Anonyme Typen sind neue Klassen, die vom Compiler erstellt wurden, um die Konstruktion zu handhabennew { thing = "stuff" };
. Implizite Typen sind vorhandene Klassen. Diesvar
ist nur eine bequeme Möglichkeit, sie zu referenzieren, wenn die Variable sofort zugewiesen wird. Der Variablentyp kann aus dem Typ des ihr zugewiesenen Objekts abgeleitet werden. Sie können sogar implizit eine Variable eingeben, die auf einen anonymen Typ verweist, dh:var a = new { thing = "stuff" };
Antworten:
quelle
.GroupBy(o => o.PropertyName).ToDictionary(g => g.Key, g => g.ToList())
Dies könnte Teil der Erweiterung der Linq-Bibliothek sein. also müssen wir nur tun.ToDictionary(o=>o.PropertyName)
ToDictionary
mitToLookup
.Ich kann @Michael Blackburn nicht kommentieren, aber ich denke, Sie haben die Ablehnung erhalten, da der GroupBy in diesem Fall nicht erforderlich ist.
Verwenden Sie es wie:
Außerdem habe ich gesehen, dass dies viel besser funktioniert als bei Verwendung von GroupBy (). ToDictionary ().
quelle
Für @ atari2600 würde die Antwort so aussehen, wenn ToLookup in Lambda-Syntax verwendet wird:
Grundsätzlich nimmt es die IGrouping und materialisiert sie für Sie in einem Listenwörterbuch mit den Werten von PropertyName als Schlüssel.
quelle
ToLookup
hat eine Überlastung, die die Arbeit erledigt.Folgendes hat bei mir funktioniert.
quelle