Esto es bastante simple pero estoy perdido: dado este tipo de conjunto de datos:
UserInfo(name, metric, day, other_metric)
y este conjunto de datos de muestra:
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
Me gustaría recuperar una tabla que enumera las métricas en orden (0,1,2,3 ..) con el número total de veces que ocurre el conteo. Entonces de este conjunto terminarías con:
0 3
1 2
2 2
3 1
Estoy lidiando con la sintaxis de LINQ pero estoy atascado en dónde poner un groupby y contar ... ¿alguna ayuda?
POST Edit: nunca pude hacer que las respuestas publicadas funcionen, ya que siempre devolvieron un registro con el número de recuentos diferentes. Sin embargo, pude armar un ejemplo de LINQ to SQL que funcionó:
var pl = from r in info
orderby r.metric
group r by r.metric into grp
select new { key = grp.Key, cnt = grp.Count()};
Este resultado me dio un conjunto ordenado de registros con 'métricas' y el número de usuarios asociados con cada uno. Soy claramente nuevo en LINQ en general y, para mi ojo inexperto, este enfoque parece muy similar al enfoque puro de LINQ, pero me dio una respuesta diferente.
Respuestas:
Después de llamar
GroupBy
, obtienes una serie de gruposIEnumerable<Grouping>
, donde cada Agrupación misma expone loKey
usado para crear el grupo y también es unIEnumerable<T>
de los elementos que están en tu conjunto de datos original. Solo tiene que recurrirCount()
a esa Agrupación para obtener el subtotal.Supongo que ya tiene una lista / matriz de algunos
class
que se pareceCuando lo haga
data.GroupBy(x => x.metric)
, significa "para cada elementox
en el IEnumerable definido pordata
, calcule.metric
, luego agrupe todos los elementos con la misma métrica en ayGrouping
devuelva unoIEnumerable
de todos los grupos resultantes. Dado su conjunto de datos de ejemplo dedaría como resultado el siguiente resultado después de groupby:
fuente
Suponiendo que
userInfoList
es unList<UserInfo>
:La función lambda para
GroupBy()
,n => n.metric
significa que va a conseguir ámbitometric
de cadaUserInfo
objeto encontrado. El tipo den
depende del contexto, en la primera aparición es de tipoUserInfo
, porque la lista contieneUserInfo
objetos. En el segundo cason
es de tipoGrouping
, porque ahora es una lista deGrouping
objetos.Grouping
s tienen métodos de extensión como.Count()
,.Key()
y casi cualquier otra cosa que esperarías. Del mismo modo que verificaría.Lenght
en unstring
, puede verificar.Count()
un grupo.fuente
fuente
group.key
en el Select (...) debe sergroup.Key