LINQ с помощью метода groupBy и граф
Это довольно просто, но я в недоумении: Учитывая этот тип набора данных:
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, но застрял на том, где поставить groupby и count.... какая-нибудь помощь??
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, но дал мне другой ответ.
3 ответа:
после вызова
GroupBy, вы получаете серию группIEnumerable<Grouping>, где каждая группировка сама выставляетKeyиспользуется для создания группы, а также являетсяIEnumerable<T>все элементы в исходном наборе данных. Вы просто должны позвонитьCount()На этой группировке, чтобы получить промежуточный итог.foreach(var line in data.GroupBy(info => info.metric) .Select(group => new { Metric = group.Key, Count = group.Count() }) .OrderBy(x => x.Metric) { Console.WriteLine("{0} {1}", line.Metric, line.Count); }
это был блестяще быстрый ответ, но у меня возникли некоторые проблемы с первой строкой, в частности "данные.groupby(info= > info.метрика)"
я предполагаю, что у вас уже есть список/массив некоторых
classвот такойclass UserInfo { string name; int metric; ..etc.. } ... List<UserInfo> data = ..... ;когда вы
data.GroupBy(x => x.metric), это означает "для каждого элементаxв IEnumerable определяетсяdata, посчитать это.metric, затем сгруппируйте все элементы с той же метрикой вGroupingи возвратIEnumerableиз всех полученных групп. Учитывая ваш пример набора данных<DATA> | Grouping Key (x=>x.metric) | joe 1 01/01/2011 5 | 1 jane 0 01/02/2011 9 | 0 john 2 01/03/2011 0 | 2 jim 3 01/04/2011 1 | 3 jean 1 01/05/2011 3 | 1 jill 2 01/06/2011 5 | 2 jeb 0 01/07/2011 3 | 0 jenn 0 01/08/2011 7 | 0это приведет к следующий результат после groupby:
(Group 1): [joe 1 01/01/2011 5, jean 1 01/05/2011 3] (Group 0): [jane 0 01/02/2011 9, jeb 0 01/07/2011 3, jenn 0 01/08/2011 7] (Group 2): [john 2 01/03/2011 0, jill 2 01/06/2011 5] (Group 3): [jim 3 01/04/2011 1]
предполагая, что
userInfoListэтоList<UserInfo>:var groups = userInfoList .GroupBy(n => n.metric) .Select(n => new { MetricName = n.Key, MetricCount = n.Count() } ) .OrderBy(n => n.MetricName);лямбда-функция для
GroupBy(),n => n.metricозначает, что он получит полеmetricС каждогоUserInfoобъект перестал работать. Типnзависит от контекста, в первом вхождении он имеет типUserInfo, потому что список содержитUserInfoобъекты. Во втором случаеnтипаGrouping, потому что теперь это списокGroupingобъекты.
Groupings имеют методы расширения, такие как.Count(),.Key()и все, что вы ожидаете. Как проверить.Lenghtнаstring, вы можете проверить.Count()о группе.