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
объекты.
Grouping
s имеют методы расширения, такие как.Count()
,.Key()
и все, что вы ожидаете. Как проверить.Lenght
наstring
, вы можете проверить.Count()
о группе.