Lambda、Linq 多列分组问题,是非常常见的需求。下面引用论坛某位坛友提出的问题:
班级 课程 老师
A 高一班 英语 小王
B 高二班 英语 小王
C 高一班 英语 小张
结果:
班级 课程 老师
A 高一班 英语 小王
C 高一班 英语 小张
经过分析可以看出,根据课程和老师进行分组,重复的取第一行的数据。传统的方法可能要写很多代码,而用Lambda或者Linq只需要几行代码就能实现。
完整代码如下:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Data[] data = new Data[]
{
new Data(){班级="高一班", 课程="英语", 老师="小王"},
new Data(){班级="高二班", 课程="英语", 老师="小王"},
new Data(){班级="高一班", 课程="英语", 老师="小张"},
new Data(){班级="高一班", 课程="英语", 老师="小张"},
};
//方式1:Lambda
var resultLambda = data.GroupBy(x => new { 课程 = x.课程, 老师 = x.老师 }).Select(x => x.FirstOrDefault());
resultLambda.ToList().ForEach(x => Console.WriteLine(string.Join(",", x.班级, x.课程, x.老师)));
//方式2:Linq
var resultLinq = from p in data
group p by new { p.课程, p.老师 } into g
select new
{
班级 = g.FirstOrDefault().班级,
课程 = g.Key.课程,
老师 = g.Key.老师,
};
resultLinq.ToList().ForEach(x => Console.WriteLine(string.Join(",", x.班级, x.课程, x.老师)));
}
}
public class Data
{
public string 班级 { get; set; }
public string 课程 { get; set; }
public string 老师 { get; set; }
}
}
运行结果:
![](http://blog.csdn.net/chinacsharper/article/details/data:image/png;base64,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)