集团LINQ

问题描述:

,我有以下数据:集团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 

我做的怎么办这个?

+0

你看看'GroupBy','Aggregate'和'Select'? – bzlm 2011-06-11 15:14:00

试试这个:

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和月新的匿名类型:

  • ID设置为密钥(CourseID)
  • 月设定为加入的结果在一起分组课程的所有月份值。这是通过使用String.Join完成的,因为它可以轻松地为值指定分隔符。
+0

非常感谢这个String.Join – VeecoTech 2011-06-11 23:39:51

GroupBy()经营者应帮助您开始

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()) 
    }; 

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)) };