这很简单,但我很困惑: 给定这类数据集:

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和计数… 任何帮助吗?

POST编辑:我从来没有能够得到张贴的答案工作,因为他们总是返回一个记录的数量不同的计数。然而,我能够把一个LINQ到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方法非常相似,但给了我不同的答案。


当前回答

假设userInfoList是一个List<UserInfo>:

var groups = userInfoList.GroupBy(n => n.metric)
                         .Select(n => new
                          {
                               MetricName = n.Key,
                               MetricCount = n.Count()
                          })
                         .OrderBy(n => n.MetricName);

GroupBy()的lambda函数,n => n.metric意味着它将从遇到的每个UserInfo对象获得字段度量。n的类型取决于上下文,在第一次出现时,它的类型为UserInfo,因为列表包含UserInfo对象。在第二次出现中,n的类型为Grouping,因为现在它是Grouping对象的列表。

分组有扩展方法,如. count (), . key()和几乎任何你想要的方法。就像在字符串上检查. length一样,可以在组上检查. count()。

其他回答

调用GroupBy后,您将得到一系列组IEnumerable<Grouping>,其中每个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);
}

> This was a brilliantly quick reply but I'm having a bit of an issue with the first line, specifically "data.groupby(info=>info.metric)"

我假设你已经有了一个类的列表/数组

class UserInfo {
    string name;
    int metric;
    ..etc..
} 
...
List<UserInfo> data = ..... ;

当你处理数据的时候。GroupBy(x => x.metric),它意味着“对于data定义的IEnumerable中的每个元素x,计算它的.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]
userInfos.GroupBy(userInfo => userInfo.metric)
        .OrderBy(group => group.Key)
        .Select(group => Tuple.Create(group.Key, group.Count()));

假设userInfoList是一个List<UserInfo>:

var groups = userInfoList.GroupBy(n => n.metric)
                         .Select(n => new
                          {
                               MetricName = n.Key,
                               MetricCount = n.Count()
                          })
                         .OrderBy(n => n.MetricName);

GroupBy()的lambda函数,n => n.metric意味着它将从遇到的每个UserInfo对象获得字段度量。n的类型取决于上下文,在第一次出现时,它的类型为UserInfo,因为列表包含UserInfo对象。在第二次出现中,n的类型为Grouping,因为现在它是Grouping对象的列表。

分组有扩展方法,如. count (), . key()和几乎任何你想要的方法。就像在字符串上检查. length一样,可以在组上检查. count()。