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

相关文章
|
1月前
|
安全 C#
C# List基本用法
C# List基本用法
|
1月前
|
C#
C# Dev chartControl的用法
C# Dev chartControl的用法
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
C#
C#的基本语法结构学习
【5月更文挑战第17天】C#基础语法包括变量(如`int x = 10`)、常量(`const int MAX_VALUE = 100`)、运算符(如算术和比较运算符)、控制语句(if、for、while等)和函数声明(`int Add(int x, int y) { return x + y; }`)。这些构成C#程序的基本元素。
46 0
|
13天前
|
前端开发 Java C#
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
|
1月前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
43 1
|
1月前
|
SQL 开发框架 .NET
C#linq表达式的应用
C#linq表达式的应用
12 0
|
1月前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
1月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
1月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。