LINQ avec groupby et le comte
C'est assez simple, mais je suis à une perte:
Compte tenu de 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
J'aimerais 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 comte se produit. Donc, à partir de cet ensemble vous finirais 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ù placer un groupby et à compter....
toute aide??
POST Edit: je n'ai jamais été en mesure d'obtenir les réponses à travailler comme ils revenaient toujours un enregistrement avec les différents chefs. Cependant, j'ai été en mesure de rassembler une LINQ to SQL exemple qui a fait un travail:
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 LINQ en général et à mon œil non averti, cette approche semble très similaire à de la pure approche de LINQ encore m'a donné une réponse différente.
- Oui je l'ai, mais jimmy l'explication m'a aidé plus. Cependant je n'ai jamais été en mesure d'obtenir son exemple de travailler, mais il ne me conduisent dans une nouvelle direction.
- utilisé la syntaxe fonctionnelle pour les expressions LINQ plutôt que la norme d'une requête LINQ de la syntaxe, et en plus il a décidé de montrer l'exécution immédiate de ces fonctions plutôt que le retard dans l'exécution de format. Pour une personne qui serait source de confusion. Ne sais pas pourquoi il a fait ça.
Vous devez vous connecter pour publier un commentaire.
Après l'appel de
GroupBy
, vous obtenez une série de groupes deIEnumerable<Grouping>
, où chaque Groupement lui-même expose leKey
utilisé pour créer le groupe et est également unIEnumerable<T>
de ce que les articles sont dans votre ensemble de données original. Vous avez juste à appelerCount()
sur le fait que le Regroupement pour obtenir le sous-total.Je suis en supposant que vous avez déjà une liste/tableau de quelques
class
qui ressemble àLorsque vous ne
data.GroupBy(x => x.metric)
, cela signifie que "pour chaque élémentx
dans l'interface IEnumerable défini pardata
, calculer ses.metric
, puis de les regrouper tous les éléments ayant la même métrique dans unGrouping
et de retourner uneIEnumerable
de tous les groupes. Compte tenu de votre exemple d'ensemble de données dele résultat serait le résultat suivant après le groupby:
En supposant
userInfoList
est unList<UserInfo>
:La fonction lambda pour
GroupBy()
,n => n.metric
signifie qu'il sera champmetric
de chaqueUserInfo
objet rencontré. Le type den
est en fonction du contexte, dans la première occurrence, il est de typeUserInfo
, parce que la liste contientUserInfo
objets. Dans la deuxième occurrencen
est de typeGrouping
, parce que maintenant c'est une liste deGrouping
objets.Grouping
s ont des méthodes d'extension comme.Count()
,.Key()
et n'importe quoi d'autre que vous attendez. Tout comme vous serait de vérifier.Lenght
sur unstring
, vous pouvez vérifier.Count()
sur un groupe.group.key
dans le Sélectionner(...) doit êtregroup.Key