Isso é bastante simples, mas estou perplexo: dado esse tipo de conjunto de dados:
UserInfo(name, metric, day, other_metric)
e este conjunto de dados de amostra:
joe 1 01/01/2011 5
jane 0 01/02/2011 9
john 2 01/03/2011 0
jim 3 01/04/2011 1
jean 1 01/05/2011 3
jill 2 01/06/2011 5
jeb 0 01/07/2011 3
jenn 0 01/08/2011 7
Gostaria de recuperar uma tabela que lista as métricas em ordem (0,1,2,3 ..) com o número total de vezes que a contagem ocorre. Portanto, desse conjunto, você terminaria com:
0 3
1 2
2 2
3 1
Estou lutando com a sintaxe LINQ, mas estou preso em onde colocar um groupby e contar .... qualquer ajuda ??
POST Edit: Eu nunca consegui que as respostas postadas funcionassem, pois elas sempre retornavam um registro com o número de contagens diferentes. No entanto, consegui montar um exemplo de LINQ to SQL que funcionou:
var pl = from r in info
orderby r.metric
group r by r.metric into grp
select new { key = grp.Key, cnt = grp.Count()};
Esse resultado me deu um conjunto ordenado de registros com 'métricas' e o número de usuários associados a cada um. Eu sou claramente novo no LINQ em geral e, para meus olhos destreinados, essa abordagem parece muito semelhante à abordagem pura do LINQ, mas me deu uma resposta diferente.
Respostas:
Após a chamada
GroupBy
, você obtém uma série de gruposIEnumerable<Grouping>
, nos quais cada Agrupamento expõe oKey
usado para criar o grupo e também é umIEnumerable<T>
dos itens que estão no seu conjunto de dados original. Você apenas precisa chamarCount()
esse agrupamento para obter o subtotal.Suponho que você já tenha uma lista / matriz de alguns
class
que se parece comQuando você faz
data.GroupBy(x => x.metric)
isso, significa "para cada elementox
no IEnumerable definido pordata
, calcule-o e.metric
, em seguida, agrupe todos os elementos com a mesma métrica em aeGrouping
retorne umIEnumerable
de todos os grupos resultantes. Dado seu conjunto de dados de exemplo deresultaria no seguinte resultado após o groupby:
fonte
Assumindo que
userInfoList
é umList<UserInfo>
:A função lambda para
GroupBy()
,n => n.metric
significa que ele obterá campometric
de todos osUserInfo
objetos encontrados. O tipo den
depende do contexto, na primeira ocorrência é do tipoUserInfo
, porque a lista contémUserInfo
objetos. Na segunda ocorrência,n
é do tipoGrouping
, porque agora é uma lista deGrouping
objetos.Grouping
s têm métodos de extensão como.Count()
,.Key()
e praticamente qualquer outra coisa que você esperaria. Assim como você verificaria.Lenght
umstring
, você pode verificar.Count()
um grupo.fonte
fonte
group.key
na Select (...) deve sergroup.Key