标准查询运算符方法的 LINQ to Objects 实现主要经过两种方法之一执行:当即执行和延迟执行。使用延迟执行的查询运算符能够进一步分为两种类别:流式处理和非流式处理。 若是你了解不一样查询运算符的执行方式,则有助于理解从给定查询中得到的结果。 若是数据源是不断变化的,或者若是你要在另外一个查询的基础上构建查询,这种帮助尤为明显。 本篇根据标准查询运算符的执行方式对其进行分类。html
当即执行指的是在代码中声明查询的位置读取数据源并执行运算。 返回单个不可枚举的结果的全部标准查询运算符都当即执行。api
延迟执行指的是不在代码中声明查询的位置执行运算。 仅当对查询变量进行枚举时才执行运算,例如经过使用 foreach
语句执行。 这意味着,查询的执行结果取决于执行查询而非定义查询时的数据源内容。 若是屡次枚举查询变量,则每次结果可能都不一样。 几乎全部返回类型为 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的标准查询运算符皆以延迟方式执行。数组
使用延迟执行的查询运算符能够另外分类为流式处理和非流式处理。数据结构
流式处理运算符不须要在生成元素前读取全部源数据。 在执行时,流式处理运算符一边读取每一个源元素,一边对该源元素执行运算,并在可行时生成元素。 流式处理运算符将持续读取源元素直到能够生成结果元素。 这意味着可能要读取多个源元素才能生成一个结果元素。spa
非流式处理运算符必须先读取全部源数据,而后才能生成结果元素。 排序或分组等运算均属于此类别。 在执行时,非流式处理查询运算符将读取全部源数据,将其放入数据结构,执行运算,而后生成结果元素。code