Это довольно просто, но я в растерянности: учитывая этот тип набора данных:
UserInfo(name, metric, day, other_metric)
и этот пример набора данных:
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
Я хотел бы получить таблицу, в которой перечислены метрики по порядку (0,1,2,3 ..) с общим числом раз, когда происходит подсчет. Таким образом, из этого набора вы бы в конечном итоге:
0 3
1 2
2 2
3 1
Я борюсь с синтаксисом LINQ, но застрял на том, где поставить группу и рассчитывать .... любая помощь ??
POST Edit: мне никогда не удавалось заставить опубликованные ответы работать, поскольку они всегда возвращали одну запись с количеством различных подсчетов. Однако я смог собрать пример LINQ to SQL, который работал:
var pl = from r in info
orderby r.metric
group r by r.metric into grp
select new { key = grp.Key, cnt = grp.Count()};
Этот результат дал мне упорядоченный набор записей с «метриками» и количеством пользователей, связанных с каждым. Я явно новичок в LINQ в целом, и на мой неопытный взгляд этот подход кажется очень похожим на чистый подход LINQ, но дал мне другой ответ.
Ответы:
После вызова
GroupBy
вы получаете серию группIEnumerable<Grouping>
, где каждая группировка сама выставляетKey
используемые для создания группы, а также представляет собойIEnumerable<T>
любой элемент в вашем исходном наборе данных. Вам просто нужно вызватьCount()
эту Группировку, чтобы получить промежуточный итог.Я предполагаю, что у вас уже есть список / массив некоторых,
class
которые выглядят какКогда вы это сделаете
data.GroupBy(x => x.metric)
, это означает, что «для каждого элементаx
в IEnumerable, определенного посредствомdata
, вычислите его.metric
, затем сгруппируйте все элементы с одинаковой метрикой в aGrouping
и верните aIEnumerable
из всех полученных групп. Учитывая ваш примерный набор данныхэто приведет к следующему результату после groupby:
источник
Предполагая
userInfoList
этоList<UserInfo>
:Лямбда-функция для
GroupBy()
,n => n.metric
означает, что она будет получать полеmetric
от каждогоUserInfo
обнаруженного объекта. Типn
зависит от контекста, в первом случае это типUserInfo
, потому что список содержитUserInfo
объекты. Во втором случаеn
это типGrouping
, потому что теперь это списокGrouping
объектов.Grouping
s имеют методы расширения , как.Count()
,.Key()
и почти все , что еще можно было бы ожидать. Точно так же, как вы можете проверить.Lenght
наstring
, вы можете проверить.Count()
на группу.источник
источник
group.key
в Select (...) должна бытьgroup.Key