Das ist ziemlich einfach, aber ich bin ratlos: Angesichts dieser Art von Datensatz:
UserInfo(name, metric, day, other_metric)
und dieser Beispieldatensatz:
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
Ich möchte eine Tabelle abrufen, in der die Metriken in der Reihenfolge (0,1,2,3 ..) mit der Gesamtanzahl der Zählungen aufgelistet sind. Aus diesem Set würden Sie also Folgendes erhalten:
0 3
1 2
2 2
3 1
Ich beschäftige mich mit der LINQ-Syntax, bin aber nicht sicher, wo ich ein Groupby platzieren und zählen soll ... jede Hilfe?
POST-Bearbeitung: Ich konnte die veröffentlichten Antworten nie zum Laufen bringen, da sie immer einen Datensatz mit der Anzahl der verschiedenen Zählungen zurückgaben. Ich konnte jedoch ein LINQ to SQL-Beispiel zusammenstellen, das funktionierte:
var pl = from r in info
orderby r.metric
group r by r.metric into grp
select new { key = grp.Key, cnt = grp.Count()};
Dieses Ergebnis gab mir einen geordneten Satz von Datensätzen mit 'Metriken' und der Anzahl der Benutzer, die jedem zugeordnet sind. Ich bin eindeutig neu in LINQ im Allgemeinen und für mein ungeübtes Auge scheint dieser Ansatz dem reinen LINQ-Ansatz sehr ähnlich zu sein, gab mir jedoch eine andere Antwort.
Antworten:
Nach dem Aufruf erhalten
GroupBy
Sie eine Reihe von GruppenIEnumerable<Grouping>
, in denen jede Gruppierung selbst dieKey
zum Erstellen der Gruppe verwendetenIEnumerable<T>
Elemente verfügbar macht und auch zu den Elementen in Ihrem Originaldatensatz gehört. Sie müssen nurCount()
diese Gruppierung aufrufen , um die Zwischensumme zu erhalten.Ich gehe davon aus, dass Sie bereits eine Liste / ein Array von einigen haben
class
, die so aussehenWenn Sie dies tun
data.GroupBy(x => x.metric)
, bedeutet dies "für jedes Elementx
in der IEnumerable, definiert durchdata
, berechnen Sie es.metric
, gruppieren Sie dann alle Elemente mit derselben Metrik in aGrouping
und geben Sie eineIEnumerable
aller resultierenden Gruppen zurück. Geben Sie Ihren Beispieldatensatz anes würde nach dem groupby zu folgendem Ergebnis führen:
quelle
Angenommen,
userInfoList
ist einList<UserInfo>
:Die Lambda - Funktion für
GroupBy()
,n => n.metric
bedeutet , dass es Feld bekommtmetric
von jedemUserInfo
begegnet Objekt. Der Typn
ist abhängig vom Kontext, beim ersten Auftreten ist er vom TypUserInfo
, da die ListeUserInfo
Objekte enthält . Im zweiten Falln
handelt es sich um einen TypGrouping
, da es sich nun um eine Liste vonGrouping
Objekten handelt.Grouping
s haben Erweiterungsmethoden wie.Count()
,.Key()
und so ziemlich alles andere, die Sie erwarten. So wie Sie überprüfen würde.Lenght
auf einstring
, können Sie überprüfen ,.Count()
auf eine Gruppe.quelle
quelle
group.key
in der Auswahl (...) muss seingroup.Key