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; }
}
}创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。