C#学习相关系列之Linq用法---group和join相关用法(三)

简介: C#学习相关系列之Linq用法---group和join相关用法(三)

一、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}...,在实际应用中根据需求选用不同的用法。

相关文章
|
19天前
|
安全 C#
C# List基本用法
C# List基本用法
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
1月前
|
C#
C#学习相关系列之yield和return的区别
C#学习相关系列之yield和return的区别
|
1月前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
1月前
|
C#
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
|
1月前
|
存储 C# 索引
C#学习相关系列之数据类型类的定义(一)
C#学习相关系列之数据类型类的定义(一)
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
22 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
79 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
59 0