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

linq关键字

以下是 LINQ(Language Integrated Query)中常见的关键字及其作用,并给出一个示例以展示其执行结果:

from

  1. from:用于指定数据源,可以是集合、数组、数据库表等。
    示例:
    var numbers = new List<int> {
          
           1, 2, 3, 4, 5 };
    var result = from num in numbers
                 select num * 2;
    // 执行结果:result = { 2, 4, 6, 8, 10 }
    

where

  1. where:用于筛选满足指定条件的元素。
    示例:
    var numbers = new List<int> {
          
           1, 2, 3, 4, 5 };
    var result = from num in numbers
                 where num % 2 == 0
                 select num;
    // 执行结果:result = { 2, 4 }
    

select

  1. select:用于选择返回的结果集。
    示例:
    var numbers = new List<int> {
          
           1, 2, 3, 4, 5 };
    var result = from num in numbers
                 select $"Number: {
            
            num}";
    // 执行结果:result = { "Number: 1", "Number: 2", "Number: 3", "Number: 4", "Number: 5" }
    

orderby

  1. orderby:用于对结果集按指定的属性进行排序。
    示例:
    var numbers = new List<int> {
          
           3, 1, 4, 2, 5 };
    var result = from num in numbers
                 orderby num descending
                 select num;
    // 执行结果:result = { 5, 4, 3, 2, 1 }
    

join

  1. join:用于在两个数据源之间执行联接操作。
    示例:
    var students = new List<Student>
    {
          
          
        new Student {
          
           Id = 1, Name = "Alice" },
        new Student {
          
           Id = 2, Name = "Bob" }
    };
    var scores = new List<Score>
    {
          
          
        new Score {
          
           StudentId = 1, Value = 90 },
        new Score {
          
           StudentId = 2, Value = 85 }
    };
    var result = from student in students
                 join score in scores on student.Id equals score.StudentId
                 select new {
          
           student.Name, score.Value };
    // 执行结果:result = { { "Alice", 90 }, { "Bob", 85 } }
    

group

  1. group:用于按指定的键对结果集进行分组。
    示例:
    var numbers = new List<int> {
          
           1, 2, 3, 4, 5 };
    var result = from num in numbers
                 group num by num % 2 into grouped
                 select new {
          
           Key = grouped.Key, Numbers = grouped.ToList() };
    // 执行结果:result = { { Key = 0, Numbers = { 2, 4 } }, { Key = 1, Numbers = { 1, 3, 5 } } }
    

let

  1. let:用于在查询过程中定义中间变量。
    示例:
    var numbers = new List<int> {
          
           1, 2, 3, 4, 5 };
    var result = from num in numbers
                 let squared = num * num
                 select squared;
    // 执行结果:result = { 1, 4, 9, 16, 25 }
    

into

  1. into:用于将查询结果存储到临时结果集中,以供后续查询操作使用。
    示例:
    var numbers = new List<int> {
          
           1, 2, 3, 4, 5 };
    var result = from num in numbers
                 where num > 2
                 select num
                 into filtered
                 where filtered < 5
                 select filtered;
    // 执行结果:result = { 3, 4 }
    

这些关键字是构建 LINQ 查询和操作表达式的重要组成部分。每个关键字都有其特定的用途,可用于执行不同的查询操作。通过组合和嵌套使用这些关键字,可以以声明性的方式构建复杂的查询逻辑。上述示例仅展示了每个关键字的一种常见用法,实际使用时可以根据需求进行灵活组合和定制。

linq方法

在 LINQ(Language Integrated Query)中,提供了许多方法用于查询和操作数据。这些方法可用于对各种数据源(如集合、数组、数据库表等)执行查询、筛选、排序、投影、分组、聚合等操作。以下是一些常见的 LINQ 方法:

筛选方法

Where

  • Where: 根据指定条件筛选元素。
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var result = numbers.Where(num => num % 2 == 0);
// 执行结果:result = { 2, 4 }

OfType

  • OfType: 筛选指定类型的元素。
var mixedList = new List<object>
{
    
    
    1, "Alice", 2, "Bob", 3, "Charlie"
};
var numbers = mixedList.OfType<int>();
// 执行结果:numbers = { 1, 2, 3 }
var names = mixedList.OfType<string>();
// 执行结果:names = { "Alice", "Bob", "Charlie" }

排序方法:

OrderBy

  • OrderBy: 根据指定的键进行升序排序。

OrderByDescending

  • OrderByDescending: 根据指定的键进行降序排序。
var numbers = new List<int> {
    
     3, 1, 4, 2, 5 };
var ascendingOrder = numbers.OrderBy(num => num);
// 执行结果:ascendingOrder = { 1, 2, 3, 4, 5 }

var descendingOrder = numbers.OrderByDescending(num => num);
// 执行结果:descendingOrder = { 5, 4, 3, 2, 1 }

ThenBy

  • ThenBy: 在已排序的结果集上根据额外的键进行升序排序。
    ThenBy 方法用于在已经进行排序的结果集上根据额外的键进行升序排序。它通常与 OrderByOrderByDescending 方法一起使用。以下是 ThenBy 方法的使用示例:
var students = new List<Student>
{
    
    
    new Student {
    
     Name = "Alice", Grade = "A", Age = 20 },
    new Student {
    
     Name = "Bob", Grade = "B", Age = 22 },
    new Student {
    
     Name = "Charlie", Grade = "A", Age = 21 },
    new Student {
    
     Name = "David", Grade = "B", Age = 20 }
};

var sortedStudents = students.OrderBy(student => student.Grade)
                             .ThenBy(student => student.Age);

经过 OrderBy 方法根据成绩进行升序排序后,students 列表将变为:

Student {
    
     Name = "Alice", Grade = "A", Age = 20 }
Student {
    
     Name = "Charlie", Grade = "A", Age = 21 }
Student {
    
     Name = "Bob", Grade = "B", Age = 22 }
Student {
    
     Name = "David", Grade = "B", Age = 20 }

然后,应用 ThenBy 方法在已排序的结果上根据年龄进行升序排序,最终的排序结果为:

Student {
    
     Name = "Alice", Grade = "A", Age = 20 }
Student {
    
     Name = "David", Grade = "B", Age = 20 }
Student {
    
     Name = "Charlie", Grade = "A", Age = 21 }
Student {
    
     Name = "Bob", Grade = "B", Age = 22 }

在上述示例中,我们有一个学生列表 students,每个学生都有姓名、成绩和年龄属性。我们首先使用 OrderBy 方法根据学生的成绩进行升序排序,然后使用 ThenBy 方法在已排序的结果上根据学生的年龄进行升序排序。

执行结果 sortedStudents 是一个按成绩和年龄排序的学生列表。如果学生有相同的成绩,那么他们将按照年龄进行排序。

注意,ThenBy 方法必须在 OrderByOrderByDescending 方法之后使用,以确保正确的排序顺序。

这个示例展示了如何使用 ThenBy 方法在已排序的结果上进行进一步的排序操作,以满足复合排序的需求。

ThenByDescending

  • ThenByDescending: 在已排序的结果集上根据额外的键进行降序排序。
    在这里插入图片描述
    在这里插入图片描述

投影方法:

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}");
}

在上述示例中,我们有两个集合:customersorderscustomers 集合包含了客户信息,orders 集合包含了订单信息。我们使用 Join 方法将这两个集合连接起来,基于它们共同的键(CustomerIdId),并创建一个包含连接结果的新集合。
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();
}

在上述示例中,我们有两个集合:departmentsemployeesdepartments 集合包含了部门信息,employees 集合包含了员工信息。我们使用 GroupJoin 方法将这两个集合进行分组连接,基于它们的共同键(IdDepartmentId),并创建一个包含连接结果的新集合。
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 方法用于计算集合中数值型元素的总和。它返回一个表示集合中元素总和的数值类型结果。以下是几个示例:
  1. 使用 Sum 方法计算整数集合的总和:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var sum = numbers.Sum();

Console.WriteLine($"Sum: {
      
      sum}");

执行结果:

Sum: 15

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

  1. 使用 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 方法用于找到集合中数值型元素的最小值。它返回集合中的最小值,其类型与集合元素的类型相同。以下是几个示例:
  1. 使用 Min 方法找到整数集合的最小值:
var numbers = new List<int> {
    
     10, 5, 3, 8, 2 };
var min = numbers.Min();

Console.WriteLine($"Min: {
      
      min}");

执行结果:

Min: 2

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

  1. 使用 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 方法用于找到集合中数值型元素的最大值。它返回集合中的最大值,其类型与集合元素的类型相同。以下是几个示例:
  1. 使用 Max 方法找到整数集合的最大值:
var numbers = new List<int> {
    
     10, 5, 3, 8, 2 };
var max = numbers.Max();
Console.WriteLine($"Max: {
      
      max}");

执行结果:

Max: 10

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

  1. 使用 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 方法时,集合中的元素类型是数值型的。如果集合中包含非数值型元素,将会引发异常。

Average

  • Average: 计算平均值。
    Average 方法用于计算集合中数值型元素的平均值。它返回一个表示集合中元素平均值的数值类型结果。以下是几个示例:
  1. 使用 Average 方法计算整数集合的平均值:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var average = numbers.Average();

Console.WriteLine($"Average: {
      
      average}");

执行结果:

Average: 3

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

  1. 使用 Average 方法计算浮点数集合的平均值:
var prices = new List<double> {
    
     10.5, 20.3, 15.2, 8.7 };
var averagePrice = prices.Average();

Console.WriteLine($"Average Price: {
      
      averagePrice}");

执行结果:

Average Price: 13.675

在上述示例中,我们有一个包含浮点数的 prices 列表。我们使用 Average 方法计算列表中元素的平均值,并将结果存储在变量 averagePrice 中。
Average 方法适用于各种数值类型,例如整数、浮点数、decimal 等。它用于计算集合中数值型元素的平均值。请确保在使用 Average 方法时,集合中的元素类型是数值型的。如果集合中包含非数值型元素,将会引发异常。

Aggregate

  • Aggregate: 执行自定义的累加逻辑。
    Aggregate 方法用于在集合中的元素之间进行累积操作,并返回一个最终的累积结果。它接受一个累积函数作为参数,该函数定义了如何对元素进行累积操作。以下是一个示例:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var sum = numbers.Aggregate((acc, num) => acc + num);

Console.WriteLine($"Sum: {
      
      sum}");

执行结果:

Sum: 15

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 Aggregate 方法对列表中的元素进行累积操作,将所有元素相加。累积函数 (acc, num) => acc + num 定义了如何进行累积操作,其中 acc 是累积的结果,num 是当前的元素。初始累积结果为列表的第一个元素,然后依次将每个元素与累积结果相加,最终得到累积的总和。

除了累积函数外,Aggregate 方法还可以接受一个可选的初始累积值作为参数。该初始累积值将作为累积操作的起点。如果提供了初始累积值,则第一次累积操作将使用该值作为累积结果。

以下是一个示例,演示带有初始累积值的 Aggregate 方法的使用:

var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var product = numbers.Aggregate(1, (acc, num) => acc * num);

Console.WriteLine($"Product: {
      
      product}");

执行结果:

Product: 120

在这个示例中,我们使用 Aggregate 方法计算整数列表中的所有元素的乘积。累积函数 (acc, num) => acc * num 定义了如何进行累积操作,初始累积值为 1,然后依次将每个元素与累积结果相乘,得到最终的乘积结果。

Aggrgate 方法可以用于各种累积操作,例如求和、求积、连接字符串等。你可以根据具体的需求定义自己的累积函数,并提供初始累积值(可选)来进行累积操作。

其他常见方法:

First

  • First: 返回第一个元素。
    First 方法用于获取集合中的第一个元素。它返回集合中的第一个元素,或者如果集合为空,则引发异常。以下是一个示例:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var firstNumber = numbers.First();

Console.WriteLine($"First Number: {
      
      firstNumber}");

执行结果:

First Number: 1

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 First 方法获取列表中的第一个元素,并将结果存储在变量 firstNumber 中。
First 方法还可以接受一个谓词函数作为参数,用于筛选满足特定条件的第一个元素。例如:

var evenNumbers = numbers.First(num => num % 2 == 0);

Console.WriteLine($"First Even Number: {
      
      evenNumbers}");

执行结果:

First Even Number: 2

在这个示例中,我们使用 First 方法和谓词函数 num => num % 2 == 0 来获取列表中的第一个偶数。方法会从列表的第一个元素开始,找到满足谓词条件的第一个偶数,并将其作为结果返回。

需要注意的是,如果集合为空,调用 First 方法将引发异常。为了避免异常,可以使用 FirstOrDefault 方法,它与 First 方法类似,但在集合为空时返回默认值(对于引用类型为 null,对于值类型为默认值)而不是引发异常。

FirstOrDefault

  • FirstOrDefault: 返回第一个元素或默认值。
    FirstOrDefault 方法用于获取集合中的第一个元素,或者如果集合为空,则返回默认值。它返回集合中的第一个元素,或者如果集合为空,则返回指定类型的默认值。以下是一个示例:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var firstNumber = numbers.FirstOrDefault();

Console.WriteLine($"First Number: {
      
      firstNumber}");

执行结果:

First Number: 1

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 FirstOrDefault 方法获取列表中的第一个元素,并将结果存储在变量 firstNumber 中。由于列表不为空,所以返回列表中的第一个元素,即 1
FirstOrDefault 方法还可以接受一个谓词函数作为参数,用于筛选满足特定条件的第一个元素。例如:

var evenNumber = numbers.FirstOrDefault(num => num % 2 == 0);

Console.WriteLine($"First Even Number: {
      
      evenNumber}");

执行结果:

First Even Number: 2

在这个示例中,我们使用 FirstOrDefault 方法和谓词函数 num => num % 2 == 0 来获取列表中的第一个偶数。方法会从列表的第一个元素开始,找到满足谓词条件的第一个偶数,并将其作为结果返回。

如果集合为空,调用 FirstOrDefault 方法将返回指定类型的默认值。对于引用类型,返回 null,对于值类型,返回该类型的默认值。
FirstOrDefault 方法是在集合中获取第一个元素时常用的方法。它可以提供默认值作为备选选项,以避免异常情况。

Single

  • Single: 返回满足条件的唯一元素。
    Single 方法用于获取集合中满足特定条件的唯一一个元素。它返回集合中满足条件的唯一元素,如果没有满足条件的元素或存在多个满足条件的元素,则引发异常。以下是一个示例:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var singleNumber = numbers.Single(num => num == 3);

Console.WriteLine($"Single Number: {
      
      singleNumber}");

执行结果:

Single Number: 3

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 Single 方法和谓词函数 num => num == 3 来获取列表中值为 3 的唯一元素,并将结果存储在变量 singleNumber 中。

需要注意的是,Single 方法要求满足条件的元素在集合中是唯一的。如果集合中没有满足条件的元素,或者存在多个满足条件的元素,将引发异常。以下是几种情况下会引发异常的示例:

var emptyList = new List<int>();
var noMatch = numbers.Single(num => num == 10);
var multipleMatches = numbers.Single(num => num > 2);

对于空集合,调用 Single 方法将引发 InvalidOperationException 异常。对于没有满足条件的元素或存在多个满足条件的元素,调用 Single 方法也会引发 InvalidOperationException 异常。

如果你希望获取集合中满足条件的唯一一个元素,但允许集合为空或有多个匹配元素时返回默认值而不是引发异常,你可以使用 SingleOrDefault 方法。它与 Single 方法类似,但在异常情况下返回指定类型的默认值而不是引发异常。

SingleOrDefault

  • SingleOrDefault: 返回满足条件的唯一元素或默认值。
    SingleOrDefault 方法用于获取集合中满足特定条件的唯一一个元素,或者如果集合为空或存在多个满足条件的元素,则返回默认值。它返回集合中满足条件的唯一元素,如果集合为空或存在多个满足条件的元素,则返回指定类型的默认值。以下是一个示例:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var singleNumber = numbers.SingleOrDefault(num => num == 3);

Console.WriteLine($"Single Number: {
      
      singleNumber}");

执行结果:

Single Number: 3

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 SingleOrDefault 方法和谓词函数 num => num == 3 来获取列表中值为 3 的唯一元素,并将结果存储在变量 singleNumber 中。

需要注意的是,SingleOrDefault 方法要求满足条件的元素在集合中是唯一的。如果集合中没有满足条件的元素,或者存在多个满足条件的元素,SingleOrDefault 方法将返回指定类型的默认值。对于引用类型,返回 null,对于值类型,返回该类型的默认值。

以下是几种情况下 SingleOrDefault 方法返回默认值的示例:

var emptyList = new List<int>();
var noMatch = numbers.SingleOrDefault(num => num == 10);
var multipleMatches = numbers.SingleOrDefault(num => num > 2);

对于空集合,调用 SingleOrDefault 方法将返回指定类型的默认值。对于没有满足条件的元素或存在多个满足条件的元素,SingleOrDefault 方法也会返回指定类型的默认值。

SingleOrDefault 方法可以在获取集合中满足条件的唯一一个元素时提供默认值作为备选选项,以避免异常情况。

Skip

  • Skip: 跳过指定数量的元素。
    Skip 方法用于跳过集合中指定数量的元素,并返回剩余的元素。它返回一个新的集合,其中包含从原始集合中跳过指定数量元素后的剩余元素。以下是一个示例:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var skippedNumbers = numbers.Skip(2);

foreach (var number in skippedNumbers)
{
    
    
    Console.WriteLine(number);
}

执行结果:

3
4
5

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 Skip 方法并指定要跳过的元素数量为 2,从而创建一个新的集合 skippedNumbers,其中包含了跳过前两个元素后的剩余元素。

然后,我们遍历 skippedNumbers 集合,并打印每个元素的值。

Skip 方法对于分页或者需要跳过集合中前几个元素的场景非常有用。它允许你根据需求跳过指定数量的元素,然后获取剩余的元素。注意,如果跳过的元素数量大于或等于集合中的元素数量,Skip 方法将返回一个空集合。

另外,可以与其他 LINQ 方法(如 WhereOrderBy 等)进行组合使用,以实现更复杂的查询和操作。

Take

  • Take: 返回指定数量的元素。
    Take 方法用于从集合中获取指定数量的元素。它返回一个新的集合,其中包含了从原始集合中获取的指定数量的元素。以下是一个示例:
var numbers = new List<int> {
    
     1, 2, 3, 4, 5 };
var takenNumbers = numbers.Take(3);

foreach (var number in takenNumbers)
{
    
    
    Console.WriteLine(number);
}

执行结果:

1
2
3

在上述示例中,我们有一个包含整数的 numbers 列表。我们使用 Take 方法并指定要获取的元素数量为 3,从而创建一个新的集合 takenNumbers,其中包含了原始集合中的前三个元素。

然后,我们遍历 takenNumbers 集合,并打印每个元素的值。

Take 方法对于分页或者需要获取集合中前几个元素的场景非常有用。它允许你根据需求获取指定数量的元素,然后进行进一步的处理。注意,如果要获取的元素数量大于集合中的元素数量,Take 方法将返回集合中的所有元素,而不会引发异常。

另外,可以与其他 LINQ 方法(如 WhereOrderBy 等)进行组合使用,以实现更复杂的查询和操作。

总结

LINQ(Language-Integrated Query)是一种用于查询和操作数据的统一查询语言,它在.NET平台中被广泛使用。LINQ提供了一组丰富的查询操作符和方法,可以应用于各种数据源,包括集合、数据库、XML等。以下是对LINQ的相关内容的简单易懂总结:

  • LINQ基本语法:LINQ使用类似SQL的查询语法或方法链式调用的形式进行查询。它包含一组关键字和方法,如fromwhereselectorderby等,用于指定查询的条件、筛选、排序等操作。

  • LINQ查询操作:通过使用LINQ,可以对集合进行各种查询操作,如筛选数据、排序、分组、连接等。可以使用关键字和方法来指定查询条件和操作。

  • 查询结果类型:LINQ查询的结果可以是原始数据类型,也可以是自定义类型。在查询中,可以通过select关键字或Select方法来指定要返回的结果类型。

  • 筛选和过滤:使用where关键字或Where方法可以根据指定的条件筛选出满足条件的元素。

  • 排序:使用orderby关键字或OrderBy方法可以对元素进行排序。还可以使用ascendingdescending关键字或OrderBy方法的重载来指定升序或降序排序。

  • 分组:使用group by关键字或GroupBy方法可以将元素按照指定的键进行分组。分组后的结果可以通过into关键字或into子句来进行进一步的操作。

  • 连接:使用join关键字或Join方法可以根据指定的键将两个集合进行连接操作。还可以使用on关键字或on子句来指定连接条件。

  • 聚合函数:LINQ提供了一些聚合函数,如SumCountMinMaxAverage等,用于计算集合中元素的总和、数量、最小值、最大值、平均值等。

  • 跳过和获取:使用Skip方法可以跳过集合中指定数量的元素,而使用Take方法可以获取集合中指定数量的元素。

  • 单个元素操作:使用FirstFirstOrDefaultSingleSingleOrDefault等方法可以获取集合中的单个元素。

  • 链式操作:LINQ支持方法链式调用的方式,可以在同一查询中使用多个操作符和方法,通过连接它们来构建复杂的查询和操作。

总的来说,LINQ提供了一种强大且灵活的方式来查询和操作数据,使得数据处理变得简单和可读。通过熟练掌握LINQ的相关操作,可以更高效地进行数据处理和查询操作。

猜你喜欢

转载自blog.csdn.net/pengjun_ge/article/details/131599184
今日推荐