C#:了解LINQ,简化数据查询和操作的强大工具(中)

简介: C#:了解LINQ,简化数据查询和操作的强大工具

投影方法:

Select

  • Select: 选择指定元素或属性。
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var squares = numbers.Select(num => num * num);
// 执行结果:squares = { 1, 4, 9, 16, 25 }
var names = new List<string> { "Alice", "Bob", "Charlie" };
var nameLengths = names.Select(name => name.Length);
// 执行结果:nameLengths = { 5, 3, 7 }


SelectMany

  • SelectMany: 投影并平坦化嵌套的集合。
    SelectMany 方法用于将一个集合中的每个元素的子集合(集合中的集合)合并为一个扁平化的结果集合。以下是一个使用 SelectMany 方法的示例:
var teams = new List<Team>
{
    new Team { Name = "Team A", Members = new List<string> { "Alice", "Bob" } },
    new Team { Name = "Team B", Members = new List<string> { "Charlie", "David" } },
    new Team { Name = "Team C", Members = new List<string> { "Eve", "Frank" } }
};
var allMembers = teams.SelectMany(team => team.Members);


在上述示例中,我们有一个包含多个团队的 teams 列表,每个团队都有一个名称和成员列表。使用 SelectMany 方法,我们将每个团队的成员列表合并为一个扁平化的结果集合 allMembers

执行结果 allMembers 是一个包含所有团队成员的扁平化集合:

"Alice", "Bob", "Charlie", "David", "Eve", "Frank"

注意,allMembers 中的元素是从每个团队的成员列表中提取出来的,并被合并为一个单独的集合。

使用 SelectMany 方法,你可以在涉及嵌套集合的情况下,方便地将多个子集合合并为一个扁平化的结果集合,以便进行进一步的操作或处理。


分组方法:

GroupBy


GroupBy: 根据指定键将元素分组。

GroupBy 方法用于根据指定的键对集合进行分组。它将集合中具有相同键的元素分组,并返回一个包含分组结果的序列。以下是一个使用 GroupBy 方法的示例:

var students = new List<Student>
{
    new Student { Name = "Alice", Grade = "A" },
    new Student { Name = "Bob", Grade = "B" },
    new Student { Name = "Charlie", Grade = "A" },
    new Student { Name = "David", Grade = "B" }
};
var groupedStudents = students.GroupBy(student => student.Grade);


在上述示例中,我们有一个包含多个学生的 students 列表,每个学生都有一个姓名和成绩。使用 GroupBy 方法,我们根据学生的成绩将学生分组。

执行结果 groupedStudents 是一个包含分组结果的序列,每个分组都表示一个成绩。每个分组都是一个键/值对的集合,其中键是成绩,值是具有相同成绩的学生集合。

你可以通过迭代分组结果来访问每个分组和其中的元素。例如,可以通过 foreach 循环来遍历每个分组并打印出其中的学生姓名:

foreach (var group in groupedStudents)
{
    Console.WriteLine("Grade: " + group.Key);
    foreach (var student in group)
    {
        Console.WriteLine("  " + student.Name);
    }
    Console.WriteLine();
}


执行结果:

Grade: A
  Alice
  Charlie
Grade: B
  Bob
  David


在上述示例中,我们使用 group.Key 来获取分组的键(成绩),然后使用内部的 foreach 循环来迭代每个分组中的学生,并打印出学生的姓名。

GroupBy 方法允许你根据指定的键对集合进行灵活的分组操作,并且可以对每个分组进行进一步的处理和操作。


连接方法:

Join

  • Join: 在两个数据源之间执行内部联接。

Join 方法用于根据两个集合中的共同键将它们进行连接。它返回一个新的集合,其中包含了两个集合中共同键匹配的元素。以下是一个使用 Join 方法的示例:

var customers = new List<Customer>
{
    new Customer { Id = 1, Name = "Alice" },
    new Customer { Id = 2, Name = "Bob" },
    new Customer { Id = 3, Name = "Charlie" }
};
var orders = new List<Order>
{
    new Order { OrderId = 1, CustomerId = 2, Product = "Phone" },
    new Order { OrderId = 2, CustomerId = 1, Product = "Laptop" },
    new Order { OrderId = 3, CustomerId = 2, Product = "Tablet" }
};
var result = customers.Join(
    orders,
    customer => customer.Id,
    order => order.CustomerId,
    (customer, order) => new { CustomerName = customer.Name, OrderProduct = order.Product });
foreach (var item in result)
{
    Console.WriteLine($"Customer: {item.CustomerName}, Product: {item.OrderProduct}");
}


在上述示例中,我们有两个集合:customers 和 orders。customers 集合包含了客户信息,orders 集合包含了订单信息。我们使用 Join 方法将这两个集合连接起来,基于它们共同的键(CustomerId 和 Id),并创建一个包含连接结果的新集合。

在 Join 方法的参数中,我们指定了两个集合的键以及连接后的结果的形式。在这个示例中,我们将客户的名称和订单的产品信息连接到一个匿名类型的对象中。

执行结果:

Customer: Bob, Product: Phone
Customer: Alice, Product: Laptop
Customer: Bob, Product: Tablet


在上述示例中,我们遍历连接后的结果集合 result,并打印每个连接结果的客户名称和订单产品信息。

Join 方法允许你根据共同键将两个集合进行连接,并获取连接后的结果。你可以根据具体的需求在连接后的结果中选择所需的信息并进行进一步的处理。


GroupJoin

  • GroupJoin: 在两个数据源之间执行左外部联接。

GroupJoin 方法用于根据一个集合的键,将该集合与另一个集合进行分组连接。它返回一个新的集合,其中每个元素包含了原始集合的元素以及与之匹配的分组的元素。以下是一个使用 GroupJoin 方法的示例:

var departments = new List<Department>
{
    new Department { Id = 1, Name = "Sales" },
    new Department { Id = 2, Name = "Marketing" },
    new Department { Id = 3, Name = "IT" }
};
var employees = new List<Employee>
{
    new Employee { Id = 1, Name = "Alice", DepartmentId = 1 },
    new Employee { Id = 2, Name = "Bob", DepartmentId = 2 },
    new Employee { Id = 3, Name = "Charlie", DepartmentId = 1 },
    new Employee { Id = 4, Name = "David", DepartmentId = 3 },
    new Employee { Id = 5, Name = "Eve", DepartmentId = 2 }
};
var result = departments.GroupJoin(
    employees,
    department => department.Id,
    employee => employee.DepartmentId,
    (department, employeeGroup) => new { DepartmentName = department.Name, Employees = employeeGroup });
foreach (var item in result)
{
    Console.WriteLine($"Department: {item.DepartmentName}");
    foreach (var employee in item.Employees)
    {
        Console.WriteLine($"  Employee: {employee.Name}");
    }
    Console.WriteLine();
}


在上述示例中,我们有两个集合:departments 和 employees。departments 集合包含了部门信息,employees 集合包含了员工信息。我们使用 GroupJoin 方法将这两个集合进行分组连接,基于它们的共同键(Id 和 DepartmentId),并创建一个包含连接结果的新集合。

在 GroupJoin 方法的参数中,我们指定了两个集合的键以及连接后的结果的形式。在这个示例中,我们将部门的名称和与之相关联的员工集合连接到一个匿名类型的对象中。


执行结果:

Department: Sales
  Employee: Alice
  Employee: Charlie
Department: Marketing
  Employee: Bob
  Employee: Eve
Department: IT
  Employee: David


在上述示例中,我们遍历分组连接后的结果集合 result,并打印每个部门及其相关的员工信息。

GroupJoin 方法允许你根据一个集合的键将该集合与另一个集合进行分组连接,并获取连接后的结果。你可以根据具体的需求访问每个连接结果的原始元素以及与之匹配的分组元素,并进行进一步的处理。


聚合方法:

Count

  • Count: 计算元素的个数。

Count 方法用于计算集合中元素的数量。它返回一个表示集合中元素数量的整数值。以下是一个使用 Count 方法的示例:

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var count = numbers.Count();
Console.WriteLine($"Count: {count}");


在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 Count 方法计算列表中元素的数量,并将结果存储在变量 count 中。


执行结果:

Count: 5

在上述示例中,Count 方法返回列表中元素的数量,即 5。

Count 方法可以用于各种集合类型,例如列表、数组、集合等。它是用于确定集合中元素数量的常用方法之一。


Sum

  • Sum: 计算元素的总和。

Sum 方法用于计算集合中数值型元素的总和。它返回一个表示集合中元素总和的数值类型结果。以下是几个示例:

使用 Sum 方法计算整数集合的总和:

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var sum = numbers.Sum();
Console.WriteLine($"Sum: {sum}");


执行结果:

Sum: 15

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 Sum 方法计算列表中元素的总和,并将结果存储在变量 sum 中。


使用 Sum 方法计算浮点数集合的总和:

var prices = new List<double> { 10.5, 20.3, 15.2, 8.7 };
var total = prices.Sum();
Console.WriteLine($"Total: {total}");


执行结果:

Total: 54.7

在上述示例中,我们有一个包含浮点数的 prices 列表。我们使用 Sum 方法计算列表中元素的总和,并将结果存储在变量 total 中。

Sum 方法适用于各种数值类型,例如整数、浮点数、decimal 等。它是用于计算集合中数值型元素总和的常用方法之一。请确保在使用 Sum 方法时,集合中的元素类型是数值型的。如果集合中包含非数值型元素,将会引发异常。


Min

  • Min: 找到最小值。

Min 方法用于找到集合中数值型元素的最小值。它返回集合中的最小值,其类型与集合元素的类型相同。以下是几个示例:

使用 Min 方法找到整数集合的最小值:

var numbers = new List<int> { 10, 5, 3, 8, 2 };
var min = numbers.Min();
Console.WriteLine($"Min: {min}");


执行结果:

Min: 2

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 Min 方法找到列表中的最小值,并将结果存储在变量 min 中。


使用 Min 方法找到浮点数集合的最小值:

var prices = new List<double> { 10.5, 20.3, 15.2, 8.7 };
var minPrice = prices.Min();
Console.WriteLine($"Min Price: {minPrice}");


执行结果:


Min Price: 8.7


在上述示例中,我们有一个包含浮点数的 prices 列表。我们使用 Min 方法找到列表中的最小值,并将结果存储在变量 minPrice 中。


Min 方法适用于各种数值类型,例如整数、浮点数、decimal 等。它用于找到集合中数值型元素的最小值。请确保在使用 Min 方法时,集合中的元素类型是数值型的。如果集合中包含非数值型元素,将会引发异常。


Max

  • Max: 找到最大值。

Max 方法用于找到集合中数值型元素的最大值。它返回集合中的最大值,其类型与集合元素的类型相同。以下是几个示例:

使用 Max 方法找到整数集合的最大值:

var numbers = new List<int> { 10, 5, 3, 8, 2 };
var max = numbers.Max();
Console.WriteLine($"Max: {max}");

执行结果:

Max: 10

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 Max 方法找到列表中的最大值,并将结果存储在变量 max 中。


使用 Max 方法找到浮点数集合的最大值:

var prices = new List<double> { 10.5, 20.3, 15.2, 8.7 };
var maxPrice = prices.Max();
Console.WriteLine($"Max Price: {maxPrice}");


执行结果:

Max Price: 20.3


在上述示例中,我们有一个包含浮点数的 prices 列表。我们使用 Max 方法找到列表中的最大值,并将结果存储在变量 maxPrice 中。

Max 方法适用于各种数值类型,例如整数、浮点数、decimal 等。它用于找到集合中数值型元素的最大值。请确保在使用 Max 方法时,集合中的元素类型是数值型的。如果集合中包含非数值型元素,将会引发异常。

相关文章
|
2月前
|
自然语言处理 C# Windows
C#开源免费的Windows右键菜单管理工具
C#开源免费的Windows右键菜单管理工具
|
3月前
|
SQL 开发框架 .NET
C#进阶-LINQ实现对集合的增删改查
本篇演示了LINQ在日常开发中的常用操作,实现结果集的增删改查。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
38 0
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---where和select用法(二)
C#学习相关系列之Linq用法---where和select用法(二)
|
4月前
|
XML 开发框架 .NET
C# | Linq基本功 —— 必学的必熟的10个方法
Linq(Language Integrated Query)是C#语言中的一种查询语言,它提供了一种统一的方式来查询和操作各种数据源,如集合、数据库、XML等。Linq的出现使得开发者能够以一种更简洁、更直观的方式来处理数据,提高了代码的可读性和可维护性。
80 0
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---group和join相关用法(三)
C#学习相关系列之Linq用法---group和join相关用法(三)
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq常用方法---排序(一)
C#学习相关系列之Linq常用方法---排序(一)
|
5月前
|
缓存 开发框架 监控
一个C#开发的开源的快速启动工具
一个C#开发的开源的快速启动工具
43 0
|
1月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
158 2
|
2月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
10 0
|
3月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。