与LINQ集团

时间:2011-06-11 15:09:24

标签: c# linq

我有以下数据:

CourseID Month  
100      Jan  
100      Feb  
101      Jan  
102      May  
102      Jun  
102      July  

我想写一个LINQ查询来返回如下数据(包括逗号):

CourseID  Months
100       Jan, Feb   
101       Jan  
102       May, Jun, July  

我该怎么做?

4 个答案:

答案 0 :(得分:7)

试试这个:

courses.GroupBy(c => c.CourseID)
    .Select(g => new 
    {
        Id = g.Key, 
        Months = String.Join(", ", g.Select(c => c.Month).ToArray()) 
    });

如果您使用的是.NET 4.0,则不需要ToArray调用,因为String.Join有一个新的重载来获取IEnumerable。

解释这是如何工作的:

首先,您按CourseID对课程组进行分组。这将返回IEnumerable<IGrouping<int, Course>> - 枚举中的每个元素都包含一个名为Key的属性 - 这是分组到其中的所有课程的CourseID。

这个位是关键:IGrouping也是IEnumerable<Course> - 这意味着它可以通过返回在Key中保存的ID下分组的每个元素进行迭代。

所有最后一部分都是选择一个新的匿名类型,它有两个属性,Id和Months:

  • ID设置为密钥(CourseID)
  • 将月份设置为将分组课程的所有月份值连接在一起的结果。这是使用String.Join完成的,因为它可以很容易地为值指定分隔符。

答案 1 :(得分:2)

var q =
    from course in courses
    group course by course.CourseID into courseGroup
    select new
    {
        CourseId = courseGroup.Key, 
        Months = string.Join(", ", (
            from c in courseGroup
            select c.Month).ToArray())
    };

答案 2 :(得分:2)

linq查询非常简单:

var courses = new List<Course>
        {
            new Course(){ CourseId = 100, Month = "JAN"},
            new Course(){ CourseId = 100, Month = "FEB"},
            new Course(){ CourseId = 101, Month = "JAN"},
        };
var q = from course in courses group course by course.CourseId into grouping select new { CourseId = grouping.Key, Months = string.Join(", ", grouping.Select(value => value.Month)) };

答案 3 :(得分:0)

GroupBy()运算符应该可以帮助您入门