Estou tentando usar o LINQ para criar um Dictionary<string, List<CustomObject>>
de a List<CustomObject>
. Posso fazer isso funcionar usando "var", mas não quero usar tipos anônimos. Aqui está o que eu tenho
var x = (from CustomObject o in ListOfCustomObjects
group o by o.PropertyName into t
select t.ToList());
Eu também tentei usar a Cast<>()
partir da biblioteca LINQ depois de terx
, mas recebo problemas de compilação com o objetivo de ser uma conversão inválida.
linq
dictionary
Atari2600
fonte
fonte
var
não está usando um tipo "anônimo", está usando um tipo "implícito". Tipos anônimos são novas classes criadas pelo compilador para manipular a construçãonew { thing = "stuff" };
. Tipos implícitos são classes existentes,var
é apenas uma maneira conveniente de referenciá-los quando a variável está sendo atribuída imediatamente; o tipo de variável pode ser deduzido do tipo de objeto que está sendo atribuído a ela. Você pode digitar até mesmo implicitamente uma variável referência a um tipo anônimo, ou seja:var a = new { thing = "stuff" };
Respostas:
fonte
.GroupBy(o => o.PropertyName).ToDictionary(g => g.Key, g => g.ToList())
Isso pode fazer parte da extensão Linq library. então só temos que fazer.ToDictionary(o=>o.PropertyName)
ToDictionary
porToLookup
.Não posso comentar sobre @ Michael Blackburn, mas acho que você recebeu o voto negativo porque o GroupBy não é necessário neste caso.
Use-o como:
Além disso, eu já vi isso ter um desempenho melhor do que ao usar GroupBy (). ToDictionary ().
fonte
Para @ atari2600, é assim que a resposta seria usando ToLookup na sintaxe lambda:
Basicamente, ele pega o IGrouping e o materializa em um dicionário de listas, com os valores de PropertyName como a chave.
fonte
ToLookup
tem uma sobrecarga que fará o trabalho.O seguinte funcionou para mim.
fonte