我有以下数据:
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()
操作员应帮助您启动