Jest to dość proste, ale jestem zagubiony: Biorąc pod uwagę ten typ zestawu danych:
UserInfo(name, metric, day, other_metric)
i ten przykładowy zestaw danych:
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
Chciałbym pobrać tabelę, która zawiera listę metryk w kolejności (0,1,2,3 ..) z całkowitą liczbą wystąpień. Więc z tego zestawu skończyłbyś:
0 3
1 2
2 2
3 1
Zmagam się ze składnią LINQ, ale utknąłem na tym, gdzie umieścić groupby i liczyć .... jakiejkolwiek pomocy?
Edycja POST: Nigdy nie udało mi się sprawić, by opublikowane odpowiedzi zadziałały, ponieważ zawsze zwracały jeden rekord z liczbą różnych wyników. Udało mi się jednak stworzyć przykład LINQ-SQL, który działał:
var pl = from r in info
orderby r.metric
group r by r.metric into grp
select new { key = grp.Key, cnt = grp.Count()};
Ten wynik dał mi uporządkowany zestaw rekordów z „metrykami” i liczbą powiązanych z nimi użytkowników. Jestem wyraźnie nowy w LINQ i moim niedoświadczonym okiem to podejście wydaje się bardzo podobne do czystego podejścia LINQ, ale dało mi inną odpowiedź.
Odpowiedzi:
Po wywołaniu
GroupBy
otrzymujesz serię grupIEnumerable<Grouping>
, w których każde z nich odsłaniaKey
używane do utworzenia grupy, a także zawieraIEnumerable<T>
dowolne elementy z oryginalnego zestawu danych. Musisz tylko zadzwonićCount()
do tego ugrupowania, aby uzyskać sumę częściową.Zakładam, że masz już listę / tablicę niektórych,
class
które wyglądająKiedy to zrobisz
data.GroupBy(x => x.metric)
, oznacza to „dla każdego elementux
w IEnumerable zdefiniowanym przezdata
, oblicz go.metric
, a następnie zgrupuj wszystkie elementy o tej samej metryki w aGrouping
i zwróć anIEnumerable
wszystkich grup wynikowych. Biorąc pod uwagę przykładowy zestaw danychspowoduje to następujący wynik po grupowaniu:
źródło
Zakładając,
userInfoList
żeList<UserInfo>
:Funkcja lambda dla
GroupBy()
,n => n.metric
oznacza to, że będzie się polemetric
z każdegoUserInfo
przedmiotu spotkaliśmy. Typn
zależy od kontekstu, przy pierwszym wystąpieniu jest typemUserInfo
, ponieważ lista zawieraUserInfo
obiekty. W drugim wystąpieniun
jest typuGrouping
, ponieważ teraz jest to listaGrouping
obiektów.Grouping
s mają metody rozszerzenie takich jak.Count()
,.Key()
i prawie nic innego można się spodziewać. Tak samo jak sprawdzić.Lenght
na zasadziestring
, można sprawdzić.Count()
na grupie.źródło
źródło
group.key
w Select (...) musi byćgroup.Key