Linq 多列分组问题,是非常常见的需求。下面引用论坛某位坛友提出的问题:

    班级         课程   老师
A  高一班     英语   小王
B  高二班     英语   小王
C  高一班     英语   小张

结果:

    班级         课程   老师
A  高一班     英语   小王
C  高一班     英语   小张


经过分析可以看出,根据课程和老师进行分组,重复的取第一行的数据。传统的方法可能要写很多代码,而用Lambda或者Linq只需要几行代码就能实现。

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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  in  data
                              group  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 ; }
     }
}