过滤操作符
Where
运算符(Linq扩展方法)根据给定条件过滤集合。
在其中扩展方法有以下两个重载。一个过载需要Func <TSource,bool>输入参数和第二个重载方法需要Func <TSource,int,bool>输入参数其中int是索引:
查询语法中的Where子句:
在上面的示例查询中,lambda表达式主体s.Age > 12 && s.Age < 20
作为谓词函数传递,用于评估集合中的每个学生。Func<TSource, bool>
也可以使用带有匿名方法的Func类型委托作为谓词函数进行传递
方法中的扩展方法语法:
与查询语法不同,您需要传递整个lambda表达式作为谓词函数。
Where扩展方法也有第二个重载,包括集合中当前元素的索引。如果需要,您可以在逻辑中使用该索引。
多个Where子句:
OfType
使用OfType运算符根据每个元素的类型过滤上述集合
排序运算符
Orderby
OrderBy按升序或降序对集合的值进行排序。默认情况下,按升序排列集合,因为ascending
关键字在这里是可选的。
多重排序:
您可以在由逗号分隔的多个字段上对集合进行排序。给定的集合将首先基于第一个字段进行排序,然后如果第一个字段的值对于两个元素是相同的,那么它将使用第二个字段进行排序等等。
注:方法语法中的多重排序工作方式不同。使用ThenBy或ThenByDecending扩展方法进行二级排序。
- LINQ包含五个排序算子:OrderBy,OrderByDescending,ThenBy,ThenByDescending和Reverse
- LINQ查询语法不支持OrderByDescending,ThenBy,ThenByDescending和Reverse。它只支持“升序”和“降序”排序方向的“排序”条款。
- LINQ查询语法支持用逗号分隔的多个排序字段,而您必须使用ThenBy&ThenByDescending方法进行二级排序。
ThenBy&ThenByDescending
分组操作
Groupby
该组包含在实现了一个IGrouping <TKey,TSource>接口的特殊类型的集合中,其中TKey是一个键值,组中已经形成了该组,而TSource是与分组键值匹配的元素的集合。
LINQ查询可以以GroupBy或Select子句结束。 item.Key=by 后面接的数据
ToLookup
ToLookup与GroupBy相同; 唯一的区别是GroupBy执行延迟,而ToLookup执行是立即的。另外,ToLookup仅适用于Method语法。查询语法不支持ToLookup。
要记住的要点:
- GroupBy&ToLookup返回一个集合,该集合具有一个键和一个基于键值字段值的内部集合。
- GroupBy的执行被推迟,而ToLookup的执行是立即的。
- LINQ查询语法可以以GroupBy或Select子句结束。
加入
加入运算符加入两个序列(集合)并产生结果。
join:
Join操作符运行于两个集合,即内部集合和外部集合。它返回一个新的集合,其中包含来自满足指定表达式的集合的元素。它与SQL的内部连接相同。
例如:
Join方法中的第一个参数用于指定内部序列,即standardList。Join方法的第二个和第三个参数用于指定一个字段,其值应该使用lambda表达式进行匹配,以便在结果中包含元素。外部序列的关键选择器student => student.StandardID
指示:将studentList的每个元素的StandardID字段与内部序列的关键字匹配standard => standard.StandardID
。如果两个键字段的值匹配,则将该元素包含在结果中。
加入查询语法:
查询语法中的连接运算符与方法语法略有不同。它需要外部序列,内部序列,密钥选择器和结果选择器。'on'关键字用于关键选择器,其中'equals'运算符的左侧是outerKeySelector,'equals'的右侧是innerKeySelector。
要记住的要点:
- Join 就像SQL的内部连接一样。它返回一个新的集合,其中包含两个集合中的通用元素,这两个集合的密钥匹
- 连接操作两个序列的内部序列和外部序列,并产生一个结果序列。
- 加入查询语法:
from... in outerSequence
join... in innerSequence
on outerKey equals innerKey
select ...
GroupJoin
方法查询:
查询语法:
投影运算符:Select,SelectMany
select
返回一个包含基于转换函数的元素的IEnumerable集合。它类似于生成平坦结果集的SQL的Select子句。
LINQ查询语法必须以Select或GroupBy子句结束。以下示例演示select运算符,该运算符返回StudentName的字符串集合。
SelectMany:
SelectMany运算符投影基于转换函数的值序列,然后将它们平铺为一个序列。
量词运算符
All
All运算符在指定的条件下评估给定集合中的每个元素,如果所有元素满足条件,则返回True。
Any
查元素是否满足给定的条件,如果有一个满足就返回真。
Contains
检查集合中是否存在指定的元素,并返回布尔值。
即使studentList中存在“Bill”,Contains也会返回false。这是因为Contains扩展方法只比较对象的引用,而不是对象的实际值。因此,要比较学生对象的值,您需要通过实现IEqualityComparer接口创建一个类,该接口比较两个Student对象的值并返回布尔值。
聚合运算符
Aggregate
执行累积操作。这个跟JavaScript里面的reduce函数一样。
Average
平均扩展方法计算集合中数值项的平均值。平均方法返回可为空或不可空的十进制,双精度或浮点值。
Count
Count运算符返回集合中元素的数量或满足给定条件的元素数量。
Max
Max运算符返回集合中最大的数字元素。
Sum
计算集合中数字项目的总和。
元素操作符 :从一个序列(集合)中返回一个特定的元素
ElementAt & ElementAtOrDefault
ElementAt: 法返回给定集合中指定索引的元素。如果指定的索引超出集合的范围,则会抛出索引超出范围的异
ElementAtOrDefault: 如果指定的索引超出了集合的范围,那么它将返回数据类型的默认值而不是抛出错误。
First & FirstOrDefault
返回集合中第零个索引的元素,即第一个元素。此外,它返回一个满足指定条件的元素
Last & LastOrDefault
返回集合中的最后一个元素.跟First&FirstOrDefault刚好是相反的。
Single & SingleOrDefault
返回集合中唯一的元素,如果找不到元素或存在多个元素都会报错。
SingleOrDefault如果集合为空,或者找不到指定条件的元素,它将返回集合的数据类型的默认值。
- Single()期望集合中只有一个元素。
- Single()在集合中没有元素或多个元素时抛出异常。
- 如果在Single()中指定了一个条件,并且结果不包含任何元素或多个元素,则会引发异常。
- SingleOrDefault()将返回一个泛型集合的数据类型的默认值,如果聚集中没有元素或指定的条件。
- 如果聚集中有多个元素或指定的条件,SingleOrDefault()将会抛出一个异常。
平等运算符
SequenceEqual
SequenceEqual方法检查元素的数量,每个元素的值和两个集合中元素的顺序是否相等。
Concat
附加两个相同类型的序列并返回一个新的序列(集合)。
生成操作符 LINQ包含了生成运算符DefaultIfEmpty,Empty,Range&Repeat。Empty,Range和Repeat方法不是IEnumerable或IQueryable的扩展方法,但它们只是静态类Enumerable中定义的静态方法。
DefaultIfEmpty
如果调用DefaultIfEmpty()的给定集合为空,则DefaultIfEmpty()方法将返回具有默认值的新集合。
DefaultIfEmpty()的另一个重载方法需要一个应该被默认值替换的值参数。
Empty
返回一个空的集合。
Empty()方法不像其他LINQ方法那样是IEnumerable或IQueryable的扩展方法。这是Enumerable静态类中包含的静态方法。所以,你可以像Enumerable.Empty <TResult>()这样的其他静态方法调用它。Empty()方法返回一个指定类型的空集合
Range
从第一个元素开始返回一个IEnumerable <T>类型的集合,其中包含指定数量的元素和顺序值。
Repeat
生成一个具有指定数量元素的IEnumerable <T>类型的集合,每个元素包含相同的指定值。
设置运算符
Distinct
不同的扩展方法返回给定集合中唯一元素的新集合。
Except
需要两个集合。它返回一个新集合,其中第一个集合中的元素不存在于第二个集合(参数集合)中。
复杂的类型跟上门一样。
Intersect
需要两个集合。它返回一个新的集合,其中包含集合中存在的公共元素。
Union
需要两个集合,并返回一个新集合,其中包含两个集合中不同的元素。
分区操作符
Skip & SkipWhile
从第一个元素开始跳过指定数量的元素,并返回其余元素.
LINQ中的SkipWhile()扩展方法跳过集合中的元素,直到指定的条件为真。它返回一个新的集合,包含所有剩余的元素,一旦指定的条件为任何元素为false。
Take & TakeWhile
返回从第一个元素开始的指定数量的元素。
TakeWhile()扩展方法返回给定集合中的元素,直到指定的条件为真。如果第一个元素本身不满足条件,则返回一个空集合。
在上面的例子中,TakeWhile()只包含第一个元素,因为第二个字符串元素不满足条件。
注:把Skip和Take联合起来就可以形成分页。
转换运算符
AsEnumerable & AsQueryable
AsEnumerable和AsQueryable方法将源对象强制转换或分别转换为IEnumerable <T>或IQueryable <T>。
Cast与AsEnumerable <T>完全相同。它将源对象转换为IEnumerable <T>。
ToArray:ToArray(),ToList(),ToDictionary():
ToArray(),ToList(),ToDictionary()方法分别将源对象转换为数组,List或Dictionary。
附加:
Let 关键字
“let”关键字在查询语法中很有用。它会投影一个新的范围变量,允许重新使用表达式并使查询更具可读性。
例如: 这里需要写,两遍 let可以看成在查询语法里面申明一个变量。
Into 关键字
分组里面也可以使用Into关键字