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

相关文章
|
4天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
1月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
2月前
|
开发框架 自然语言处理 .NET
C#一分钟浅谈:LINQ 查询表达式的使用技巧
【9月更文挑战第6天】LINQ(Language Integrated Query)是C#开发中的强大工具,使查询数据集合变得简单且接近自然语言。本文从基础入手,通过具体示例讲解LINQ查询表达式的使用技巧,包括过滤、排序和分组等操作。同时,文章还探讨了常见问题及解决方法,如性能优化、过早枚举和类型转换等,帮助开发者写出更高效、易维护的代码。
94 15
|
2月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
88 2
|
3月前
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
|
5月前
|
C#
技术经验分享:C#DUID的用法及取得整数的几个方法
技术经验分享:C#DUID的用法及取得整数的几个方法
67 1
|
4月前
|
Dart 算法 JavaScript
C#数据结构与算法入门教程,值得收藏学习!
C#数据结构与算法入门教程,值得收藏学习!
|
5月前
|
开发框架 .NET 程序员
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
33 0
|
13天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
28 3
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。