C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类
- 2019 年 10 月 4 日
- 筆記
标准查询运算符方法的 LINQ to Objects 实现主要通过两种方法之一执行:立即执行和延迟执行。使用延迟执行的查询运算符可以进一步分为两种类别:流式处理和非流式处理。 如果你了解不同查询运算符的执行方式,则有助于理解从给定查询中获得的结果。 如果数据源是不断变化的,或者如果你要在另一个查询的基础上构建查询,这种帮助尤其明显。 本篇根据标准查询运算符的执行方式对其进行分类。
执行方式
即时
立即执行指的是在代码中声明查询的位置读取数据源并执行运算。 返回单个不可枚举的结果的所有标准查询运算符都立即执行。
推迟
延迟执行指的是不在代码中声明查询的位置执行运算。 仅当对查询变量进行枚举时才执行运算,例如通过使用 foreach
语句执行。 这意味着,查询的执行结果取决于执行查询而非定义查询时的数据源内容。 如果多次枚举查询变量,则每次结果可能都不同。 几乎所有返回类型为 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的标准查询运算符皆以延迟方式执行。
使用延迟执行的查询运算符可以另外分类为流式处理和非流式处理。
流式处理
流式处理运算符不需要在生成元素前读取所有源数据。 在执行时,流式处理运算符一边读取每个源元素,一边对该源元素执行运算,并在可行时生成元素。 流式处理运算符将持续读取源元素直到可以生成结果元素。 这意味着可能要读取多个源元素才能生成一个结果元素。
非流式处理
非流式处理运算符必须先读取所有源数据,然后才能生成结果元素。 排序或分组等运算均属于此类别。 在执行时,非流式处理查询运算符将读取所有源数据,将其放入数据结构,执行运算,然后生成结果元素。
分类表
下表按照执行方法对每个标准查询运算符方法进行了分类。
如果某个运算符被标入两个列中,则表示在运算中涉及两个输入序列,每个序列的计算方式不同。 在此类情况下,参数列表中的第一个序列始终以延迟流式处理方式来执行计算。
标准查询运算符 |
返回类型 |
立即执行 |
延迟的流式处理执行 |
延迟非流式处理执行 |
---|---|---|---|---|
Aggregate |
TSource |
X |
|
|
All |
Boolean |
X |
|
|
Any |
Boolean |
X |
|
|
AsEnumerable |
IEnumerable<T> |
|
X |
|
Average |
单个数值 |
X |
|
|
Cast |
IEnumerable<T> |
|
X |
|
Concat |
IEnumerable<T> |
|
X |
|
Contains |
Boolean |
X |
|
|
Count |
Int32 |
X |
|
|
DefaultIfEmpty |
IEnumerable<T> |
|
X |
|
Distinct |
IEnumerable<T> |
|
X |
|
ElementAt |
TSource |
X |
|
|
ElementAtOrDefault |
TSource |
X |
|
|
Empty |
IEnumerable<T> |
X |
|
|
Except |
IEnumerable<T> |
|
X |
X |
First |
TSource |
X |
|
|
FirstOrDefault |
TSource |
X |
|
|
GroupBy |
IEnumerable<T> |
|
|
X |
GroupJoin |
IEnumerable<T> |
|
X |
X |
Intersect |
IEnumerable<T> |
|
X |
X |
Join |
IEnumerable<T> |
|
X |
X |
Last |
TSource |
X |
|
|
LastOrDefault |
TSource |
X |
|
|
LongCount |
Int64 |
X |
|
|
Max |
单个数值、TSource 或 TResult |
X |
|
|
Min |
单个数值、TSource 或 TResult |
X |
|
|
OfType |
IEnumerable<T> |
|
X |
|
OrderBy |
IOrderedEnumerable<TElement> |
|
|
X |
OrderByDescending |
IOrderedEnumerable<TElement> |
|
|
X |
Range |
IEnumerable<T> |
|
X |
|
Repeat |
IEnumerable<T> |
|
X |
|
Reverse |
IEnumerable<T> |
|
|
X |
Select |
IEnumerable<T> |
|
X |
|
SelectMany |
IEnumerable<T> |
|
X |
|
SequenceEqual |
Boolean |
X |
|
|
Single |
TSource |
X |
|
|
SingleOrDefault |
TSource |
X |
|
|
Skip |
IEnumerable<T> |
|
X |
|
SkipWhile |
IEnumerable<T> |
|
X |
|
Sum |
单个数值 |
X |
|
|
Take |
IEnumerable<T> |
|
X |
|
TakeWhile |
IEnumerable<T> |
|
X |
|
ThenBy |
IOrderedEnumerable<TElement> |
|
|
X |
ThenByDescending |
IOrderedEnumerable<TElement> |
|
|
X |
ToArray |
TSource 数组 |
X |
|
|
ToDictionary |
Dictionary<TKey,TValue> |
X |
|
|
ToList |
IList<T> |
X |
|
|
ToLookup |
ILookup<TKey,TElement> |
X |
|
|
Union |
IEnumerable<T> |
|
X |
|
Where |
IEnumerable<T> |
|
X |