标准查询运算符方法的 LINQ to Objects 实现以两种主要方式之一执行:立即或延迟。 使用延迟执行的查询运算符可以分为两个类别:流式处理和非流式处理。 如果知道不同查询运算符的执行方式,它可以帮助你了解从给定查询中获取的结果。 如果数据源发生更改,或者正在基于另一个查询生成查询,则尤其如此。 本主题根据标准查询运算符的执行方式对标准查询运算符进行分类。
执行方式
立刻
立即执行意味着将读取数据源,并在查询声明的代码位置执行该操作。 返回单个不可枚举结果的所有标准查询运算符都会立即执行。
已推迟
延迟执行意味着操作不会在查询声明的代码中的那个位置执行。 仅当枚举查询变量时,才执行该作,例如使用 For Each
语句。 这意味着执行查询的结果取决于执行查询时数据源的内容,而不是定义查询的时间。 如果多次枚举查询变量,则每次结果都可能会有所不同。 几乎所有返回类型为 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的标准查询运算符都是以延迟方式执行的。
使用延迟执行的查询运算符可以另外归类为流式处理或非流式处理。
流媒体
流式处理运算符在生成元素之前不必读取所有源数据。 在执行时,流式运算符在读取每个源元素时执行其操作,并在适当时产出元素。 流式处理运算符继续读取源元素,直到可以生成结果元素。 这意味着可以读取多个源元素以生成一个结果元素。
非流式处理
非流式处理运算符必须读取所有源数据,然后才能生成结果元素。 排序或分组等作属于此类别。 在执行时,非流式处理查询运算符读取所有源数据,将其放入数据结构中,执行作并生成生成的元素。
分类表
下表根据其执行方法对每个标准查询运算符方法进行分类。
注释
如果运算符在两列中标记,则作中涉及两个输入序列,并且每个序列的计算方式不同。 在这些情况下,它始终是参数列表中以延迟流式处理方式计算的第一个序列。