使用LINQ分组



我有以下数据:

CourseID月份1月100日2月100日1月101日5月102日6月102日7月102日

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

课程ID月份1月100日,2月1月101日102五月、六月、七月

我该怎么做?

试试这个:

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设置为Key(课程Id)
  • Months设置为将分组课程的所有Month值合并在一起的结果。这是使用String.Join完成的,因为它可以轻松地为值指定分隔符
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)) };

GroupBy()操作员应帮助您启动

相关内容

  • 没有找到相关文章

最新更新