C'est assez simple, mais je suis à perte: étant donné ce type de jeu de données:
UserInfo(name, metric, day, other_metric)
et cet exemple de jeu de données:
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
Je voudrais récupérer un tableau qui répertorie les mesures dans l'ordre (0,1,2,3 ..) avec le nombre total de fois où le décompte se produit. Donc, à partir de cet ensemble, vous vous retrouveriez avec:
0 3
1 2
2 2
3 1
Je suis aux prises avec la syntaxe LINQ mais je suis coincé sur l'endroit où mettre un groupby et compter .... toute aide ??
POST Edit: Je n'ai jamais réussi à obtenir les réponses publiées car elles renvoyaient toujours un enregistrement avec le nombre de dénombrements différents. Cependant, j'ai pu assembler un exemple LINQ to SQL qui a fonctionné:
var pl = from r in info
orderby r.metric
group r by r.metric into grp
select new { key = grp.Key, cnt = grp.Count()};
Ce résultat m'a donné un ensemble ordonné d'enregistrements avec des «métriques» et le nombre d'utilisateurs associés à chacun. Je suis clairement nouveau pour LINQ en général et à mon avis, cette approche semble très similaire à l'approche pure LINQ mais m'a donné une réponse différente.
Réponses:
Après avoir appelé
GroupBy
, vous obtenez une série de groupesIEnumerable<Grouping>
, où chaque regroupement lui-même expose les élémentsKey
utilisés pour créer le groupe et fait également partieIEnumerable<T>
des éléments de votre ensemble de données d'origine. Il vous suffit d'appelerCount()
ce groupement pour obtenir le sous-total.Je suppose que vous avez déjà une liste / tableau de certains
class
qui ressemble àLorsque vous le faites
data.GroupBy(x => x.metric)
, cela signifie "pour chaque élémentx
dans le IEnumerable défini pardata
, calculez-le.metric
, puis regroupez tous les éléments avec la même métrique dans unGrouping
et retournez unIEnumerable
de tous les groupes résultants. Compte tenu de votre exemple d'ensemble de données deil en résulterait le résultat suivant après le groupby:
la source
En supposant que
userInfoList
c'estList<UserInfo>
:La fonction lambda pour
GroupBy()
,n => n.metric
signifie qu'elle obtiendra le champmetric
de chaqueUserInfo
objet rencontré. Le type den
dépend du contexte, dans la première occurrence, il est de typeUserInfo
, car la liste contient desUserInfo
objets. Dans la deuxième occurrencen
est de typeGrouping
, car maintenant c'est une liste d'Grouping
objets.Grouping
s ont des méthodes d'extension comme.Count()
,.Key()
et à peu près tout ce que vous attendez. Tout comme vous vérifieriez.Lenght
unstring
, vous pouvez vérifier.Count()
un groupe.la source
la source
group.key
dans la sélection (...) doit êtregroup.Key