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

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

Average

  • Average: 计算平均值。

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

使用 Average 方法计算整数集合的平均值:

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


执行结果:


Average: 3

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


使用 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 方法(如 Where、OrderBy 等)进行组合使用,以实现更复杂的查询和操作。


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 方法(如 Where、OrderBy 等)进行组合使用,以实现更复杂的查询和操作。


总结


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


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


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


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


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


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


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


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


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


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


单个元素操作:使用First、FirstOrDefault、Single、SingleOrDefault等方法可以获取集合中的单个元素。


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


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


相关文章
|
2月前
|
自然语言处理 C# Windows
C#开源免费的Windows右键菜单管理工具
C#开源免费的Windows右键菜单管理工具
|
2月前
|
SQL 开发框架 .NET
C#进阶-LINQ实现对集合的增删改查
本篇演示了LINQ在日常开发中的常用操作,实现结果集的增删改查。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
57 0
|
2月前
|
IDE C# 开发工具
一个开源轻量级的C#代码格式化工具(支持VS和VS Code)
一个开源轻量级的C#代码格式化工具(支持VS和VS Code)
107 6
|
2月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---where和select用法(二)
C#学习相关系列之Linq用法---where和select用法(二)
115 2
|
17天前
|
开发框架 .NET 程序员
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
11 0
|
1月前
|
算法 C#
C#开源实用的工具类库,集成超过1000多种扩展方法
C#开源实用的工具类库,集成超过1000多种扩展方法
|
2月前
|
SQL 开发框架 .NET
C#linq表达式的应用
C#linq表达式的应用
19 0
|
2月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---group和join相关用法(三)
C#学习相关系列之Linq用法---group和join相关用法(三)
114 1
|
2月前
|
开发框架 安全 .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
242 2