Próbuję użyć LINQ, aby utworzyć Dictionary<string, List<CustomObject>>
z List<CustomObject>
. Mogę to uruchomić używając "var", ale nie chcę używać typów anonimowych. Oto co mam
var x = (from CustomObject o in ListOfCustomObjects
group o by o.PropertyName into t
select t.ToList());
Kiedyś próbowałem również użyć Cast<>()
z biblioteki LINQ x
, ale pojawiają się problemy z kompilacją, które powodują, że jest to nieprawidłowe rzutowanie.
linq
dictionary
Atari2600
źródło
źródło
var
nie jest typem „anonimowym”, lecz typem „niejawnym”. Typy anonimowe to nowe klasy utworzone przez kompilator do obsługi konstrukcjinew { thing = "stuff" };
. Typy niejawne są istniejącymi klasami,var
są po prostu wygodnym sposobem na odwołanie się do nich, gdy zmienna jest przypisywana natychmiastowo, typ zmiennej można wywnioskować z typu przypisywanego do niej obiektu. Możesz nawet niejawnie wpisać zmienną odwołującą się do typu anonimowego, np .:var a = new { thing = "stuff" };
Odpowiedzi:
źródło
.GroupBy(o => o.PropertyName).ToDictionary(g => g.Key, g => g.ToList())
Może to być część rozszerzenia biblioteki Linq. więc musimy tylko zrobić.ToDictionary(o=>o.PropertyName)
ToDictionary
zToLookup
.Nie mogę komentować @Michael Blackburn, ale myślę, że dostałeś głos przeciw, ponieważ GroupBy nie jest w tym przypadku konieczne.
Używaj go jak:
Dodatkowo widziałem, że to działa o wiele lepiej niż przy użyciu GroupBy () .ToDictionary ().
źródło
Dla @ atari2600 odpowiedź wyglądałaby tak, jak przy użyciu ToLookup w składni lambda:
Zasadniczo pobiera IGrouping i materializuje go dla Ciebie w słowniku list, z wartościami PropertyName jako kluczem.
źródło
ToLookup
ma przeciążenie, które wykona zadanie.Poniższe zadziałały dla mnie.
źródło