一、Group用法
在C#的LINQ中,Grou将集合中的元素按照指定的键进行分组。Group方法返回一个IEnumerable<IGrouping<TKey, TElement>>类型的集合,其中TKey表示分组的键类型,TElement表示集合中元素的类型。每个IGrouping<TKey, TElement>对象表示一个分组,其中Key属性表示分组的键,而IEnumerable<TElement>表示分组中的元素集合。
1、groupby的定义:
//Linq语句 var tt = from e in stuList group e by e.Math; //lambda 表达式 var tt = stuList.GroupBy(p=>p.Math);
示例代码:
List<Student_1> stuList = new List<Student_1>() { new Student_1(){ID=1,Name="John",Chinese=92,Math=88,English=92}, new Student_1(){ID=2,Name="Mary",Chinese=87,Math=94,English=82}, new Student_1(){ID=3,Name="KangKang",Chinese=89,Math=91,English=96}, new Student_1(){ID=4,Name="Maria",Chinese=88,Math=65,English=94}, new Student_1(){ID=5,Name="Ben",Chinese=70,Math=91,English=82}, }; //var tt = from e in stuList group e by e.Math;//linq语句 var tt = stuList.GroupBy(p=>p.Math);//lambda表达式 foreach (var item in tt) { Console.WriteLine(item.Key); foreach (var e in item) { Console.WriteLine(" "+e.Name); } }
运行结果为:
2、group...into...用法可以生成一个temp组
var tt = from e in stuList group new { e.Math, e.ID, e.Name } by e.Math into temp select new { temp.Key, value1 = temp.Select(p => new { p.ID, p.Name }), value2 = temp.Select(p => p.Name) }; // var tt = stuList.GroupBy(p => p.Math, e => new { e.Math, e.ID, e.Name }).Select(temp => new { temp.Key, value1 = temp.Select(p => new { p.ID, p.Name }), value2 = temp.Select(p => p.Name) }); foreach (var item in tt) { Console.WriteLine(item.Key); foreach (var e in item.value1) { Console.WriteLine(e.Name); } }
运行结果为:
二、Join用法
Linq中的join用于将两个集合中的元素进行匹配,返回一个新的集合。
1、内部链接 Join (join… in… on …equals…)
定义:
//使用查询语句 Linq var list = from T1 in dataSource1 join T2 in dataSource2 on T1.ID equals T2.ID select new {Name = T1.Name,ID=T1.ID,NickName = T2.NickName}; //使用查询方法 lambda 表达式 var list = dataSource1.Join(dataSource2,T1 => T1.ID,T2 => T2.ID, (T1,T2) => new { Name = T1.Name, ID=T1.ID, NickName = T2.NickName });
代码示例:
List<Student> students = new List<Student>() { new Student() { Id = 1, Name = "Tom" }, new Student() { Id = 2, Name = "Jerry" }, new Student() { Id = 3, Name = "Mike" } }; List<Course> courses = new List<Course>() { new Course() { Id = 1, Name = "Math", StudentId = 1 }, new Course() { Id = 2, Name = "English", StudentId = 1 }, new Course() { Id = 3, Name = "Math", StudentId = 2 }, new Course() { Id = 4, Name = "Science", StudentId = 3 } }; // 使用join将学生和课程进行匹配 var result = from s in students join c in courses on s.Id equals c.StudentId select new { StudentName = s.Name, CourseName = c.Name }; // 输出结果 foreach (var item in result) { Console.WriteLine("{0}选了{1}课程", item.StudentName, item.CourseName); }
运行结果为:
2、分组链接Groupjoin (join…in…on…equals…into…)
定义:
//lambda 表达式 var result = students.GroupJoin(courses, p => p.Id,s => s.StudentId,(p, e) => new { StudentName = p.Name, CourseName =e.Select(m=>m.Name)}); //linq 语句 var result = from left in students join right in courses on left.Id equals right.StudentId into temp select new { StudentName = left.Name, CourseName = temp.Select(m => m.Name) }; // temp 其实为course的分组
代码示例:
// 创建学生和课程集合 List<Student> students = new List<Student>() { new Student() { Id = 1, Name = "Tom" }, new Student() { Id = 2, Name = "Jerry" }, new Student() { Id = 3, Name = "Mike" } }; List<Course> courses = new List<Course>() { new Course() { Id = 1, Name = "Math", StudentId = 1 }, new Course() { Id = 2, Name = "English", StudentId = 1 }, new Course() { Id = 3, Name = "Math", StudentId = 2 }, new Course() { Id = 4, Name = "Science", StudentId = 3 } }; // var result = students.GroupJoin(courses, p => p.Id,s => s.StudentId,(p, e) => new { StudentName = p.Name, CourseName =e.Select(m=>m.Name)}); var result = from left in students join right in courses on left.Id equals right.StudentId into temp select new { StudentName = left.Name, CourseName = temp.Select(m => m.Name) }; // temp 其实为course的分组 // 使用join将学生和课程进行匹配 //var result = from s in students // join c in courses on s.Id equals c.StudentId // select new { StudentName = s.Name, CourseName = c.Name }; // 输出结果 foreach (var item in result) { Console.WriteLine("{0}选了课程", item.StudentName); foreach (var n in item.CourseName) { Console.WriteLine("课程为:{0}",n); } }
运行结果为:
通过对比可以发现,join和groupjion的区别在于,join相当于左右一对一关系,例如:
左1=右1,左1=右2....这样一一列举,但groupjoin不一样,他是以左一为关键字,将左一的值生成一个list,例如 左1={右1,右2}...,在实际应用中根据需求选用不同的用法。