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

news2024/9/22 2:05:44

文章目录

  • linq关键字
    • from
    • where
    • select
    • orderby
    • join
    • group
    • let
    • into
  • linq方法
    • 筛选方法
      • Where
      • OfType
    • 排序方法:
      • OrderBy
      • OrderByDescending
      • ThenBy
      • ThenByDescending
    • 投影方法:
      • Select
      • SelectMany
    • 分组方法:
      • GroupBy
    • 连接方法:
      • Join
      • GroupJoin
    • 聚合方法:
      • Count
      • Sum
      • Min
      • Max
      • Average
      • Aggregate
    • 其他常见方法:
      • First
      • FirstOrDefault
      • Single
      • SingleOrDefault
      • Skip
      • Take
  • 总结

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的相关操作,可以更高效地进行数据处理和查询操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高效方案:30万条数据插入 MySQL 仅需13秒

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证 实体类、mapper和配置文件定义 User实体 mapper接口 mapper.xml文件 jdbc.properties sqlMapConfig.xml 不分批次直接梭哈 循环逐条插入 MyBatis实现插入30万条数据 J…

SpringBoot 集成 MybatisPlus 一——介绍

MybatisPlus 是 Mybatis 的升级版本&#xff0c;是对 Mybatis 的简化&#xff0c;因为他们的口号就是“为简化开发而生”。 1、创建数据表 CREATE TABLE ​​User​​ ( ​​id​​ INT NOT NULL, ​​username​​ VARCHAR(50) NULL DEFAULT NULL, ​​gendar​​ CHAR(2) NU…

了解微服务架构

微服务架构 软件架构历史 Software As A Service&#xff0c;这不仅仅是⼀个理念&#xff0c;它更多释放的是企业在新⼀轮的市场竞争中&#xff0c;如何使⽤轻量级的组织架构和新的软件架构来更好的服务企业⾯向未来的战略调整和市场定位&#xff0c;从⽽赢得未来的市场空间。…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 6 日论文合集)

文章目录 一、分割|语义相关(15篇)1.1 Prompting Diffusion Representations for Cross-Domain Semantic Segmentation1.2 ZJU ReLER Submission for EPIC-KITCHEN Challenge 2023: Semi-Supervised Video Object Segmentation1.3 Multi-Modal Prototypes for Open-Set Semanti…

基于YOLO的3D人脸关键点检测方案

目录 前言一、任务列表二、3D人脸关键点数据H3WB2.下载方法3.任务4.评估5.使用许可 3DFAWAFLW2000-3D 三、3D关键点的Z维度信息1.基于3DMM模型的方法2.H3WB 四、当前SOTA的方法1.方法1 五、我们的解决方法1.数据转为YOLO格式2.修改YOLO8Pose的入口出口3.开始训练&#xff0c;并…

aardio 的addHeaders请求

aardio群 625494397 废话不多说 直接开干&#xff01; import web.json; import console; import inet.whttp; web.json.parse( json );//转化json格式 h.addHeaders {Accept-Encoding gzip, deflate, br;Accept-Language zh-CN,zh;q0.9;User-Agent Mozilla/5.0 (Windows …

浅谈智能照明控制管理系统的功能介绍

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;智能照明控制系统较好地实现了智能控制、人性化照明和节能降耗的功能,使其在楼宇控制领域变得越来越重要,越来越受到人们的重视。本文介绍了智能照明控制系统的概念、特点、优势、发展方向等内容,并着重对智能照明控制…

多个项目的进度管理:掌握这3点,轻松应对

在现代的企业竞争中&#xff0c;许多企业组织都会同时进行多个项目。而有效的进度管理对于确保项目按时交付和优化资源利用至关重要。那么有哪些方法可以帮助项目管理者掌握多个项目的进度管理呢&#xff1f; 一&#xff1a;明确目标和优先级 在管理多个项目时&#xff0c;明确…

windows系统使用nvm实现多版本node切换

介绍nvm 是 node version manager&#xff08;node 版本管理工具&#xff09;的缩写&#xff0c;是一个命令行工具&#xff0c;用于管理和切换到不同版本的 node.js。 不同的项目可能需要不同版本的 node.js 和 npm&#xff08;node 包管理器&#xff09;&#xff0c;例如&…

增强型视觉系统 (EVS)

增强型视觉系统 EVS 1、增强型视觉系统概览2、车载相机 HAL2.1 EVS 应用2.2 EVS 管理器2.3 EVS HIDL 接口2.4 内核驱动程序 《增强型视觉系统 (EVS) 1.1 集成指南》 车载相机 HAL 1、增强型视觉系统概览 为了增强视频串流管理和错误处理&#xff0c;Android 11 更新了车载相机…

OD查找偏移表达式

1、在CE中先找到血地址2DF94C28 2、在od数据段dd 血地址 dd 2DF94C28查找到数据 3、在血地址位置右键-断点-硬件访问-DWORD&#xff0c;再操作游戏会再改变这个地址代码段下断点&#xff0c;查找到 4、验证查找的是否正确&#xff0c;在8199FA处下断点&#xff0c;dd edi288处…

github port 22 connection refused 不通过科学上网连接不上问题

原因是用密钥连接github走的是ssh&#xff0c;ssh默认端口是22没有加密&#xff0c;github不让走22 解决办法是在 ~/.ssh/config里添加 Host github.com Hostname ssh.github.com Port 443 让ssh连github的时候走443端口&#xff0c;TLS加密的 ssh -T gitgithub.com 说明已…

Docker深入

一、简介 Docker是一个用于构建、运行、传送应用程序的平台。 2、为什么使用Docker 在部署服务器过程中&#xff0c;配置各种环境变量、第三方依赖等等&#xff0c;耗费时间太长&#xff0c;使用Docker可以将他们打包成一个集装箱&#xff0c;只要在开发环境中运行成功&…

Hive 复习重点

文章目录 特点SQL查询转换成MR作业的过程内部表 & 外部表 & 分区表 & 分桶表内部表外部表分区表 分桶表DQL语法性能优化SQL语句优化数据格式化 ORC, Parquet列式存储小文件过多优化并行执行优化JVM 优化推测执行行列过滤limit 限制本地模式(开启MR&#xff0c;单机…

stm32mp157——通过按键中断实现LED灯的亮灭

EXTI章节初始化 void hal_exit_init(EXTI编号,GPIOF组编号,中断触发方式) 调用:hal_exit_init(EXTI9,0x05,下降沿触发) 调用: hal_exit_init(EXTI7,0x05,下降沿触发) 调用: hal_exit_init(EXTI8,0x05,下降沿触发) GIC章节初始化 void hal_gic_init(中断号,中断优先级) 调用: ha…

Redis - 一篇讲解根据 Key 前缀统计分析内存占用

问题描述 今天遇到一个 Redis 内存打挂了的问题&#xff0c;想看看哪个前缀 Key 占用内存比较大&#xff1f;&#xff01; 原因分析 我们都知道如果直接用 Keys 参数去做统计很危险&#xff0c;而且也只能统计数量&#xff0c;当然也可以排序去前几名的占用内存 Key 对应的大…

ESP32(掌控板) 电子琴

ESP32&#xff08;掌控板&#xff09; 电子琴 本程序实现了电子琴功能&#xff0c;通过机械按键改变变量的值实现“翻页”&#xff08;每个八度分两页&#xff0c;共六页&#xff09;&#xff0c;通过触摸按键弹奏&#xff08;包含半音&#xff09;&#xff0c;屏幕显示当前触摸…

基于微信小程序充电桩预约管理系统的设计与实现(论文+源码)_kaic

摘要 微信小程序的充电桩预约管理系统是一个复杂的系统&#xff0c;需要遵循不同的设计原则和方法&#xff0c;在实现高可用性、高性能、高安全性和高稳定性等特点的同时&#xff0c;还要注重用户体验和易用性&#xff0c;不断改进和迭代优化&#xff0c;以提高系统性能和用户满…

replicaSet,DaemonSet and Job

ReplicaSet 上一篇讲到的 ReplicationController 是用于复制和在异常的时候重新调度节点的 K8S 组件&#xff0c;后面 K8S 又引入了 ReplicaSet 资源来替代 ReplicationController ReplicationController 和 ReplicaSet 有什么区别呢&#xff1f; ReplicationController 和 …

Java中一个类可以继承多个类吗?揭秘多重继承的秘密!

大家好&#xff0c;我是你们的小米&#xff01;今天&#xff0c;我们来聊聊Java中一个备受争议的话题——"一个类可以继承多个类吗&#xff1f;"这是一个让许多Java初学者困惑的问题&#xff0c;也是一个常常被问及的热门话题。那么&#xff0c;到底Java中是否允许一…