前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类

C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类

作者头像
张传宁IT讲堂
发布2019-09-17 18:26:39
4990
发布2019-09-17 18:26:39
举报

标准查询运算符方法的 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

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 即时
  • 推迟
    • 流式处理
      • 非流式处理
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com