繁体   English   中英

LINQ IEnumerable如何在后台运行?

[英]How does a LINQ IEnumerable work under the hood?

阅读了各种LINQ教程之后,我想知道它在幕后到底是如何工作的,我希望有人可以通过以下示例代码来确认我的一些问题:

// The Three Parts of a LINQ Query:
//  1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
    from num in numbers
    where (num % 2) == 0
    select num;

// 3. Query execution.
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

我的问题涉及第2部分:

  1. 在这里,我们使用LINQ语法创建IEnumerable对象。 这与foreach语句(如List)中使用的任何其他IEnumerable对象没有区别吗?
  2. 与所有IEnumerable一样,使用foreach语句对内容进行迭代。 我的查询来自LINQ IEnumerables,使用延迟执行 -何时实际收集IEnumerable的内容? 是在调用GetEnumerator()时吗?

对于问题2,我的假设是从LINQ查询生成的对象在GetEnumerator函数内生成代码,该函数以LINQ语法表示的方式检索数据。 只是我的猜测...除非我认为LINQ完全错误...

您的两个问题密切相关。

所以,是的,有区别。 LINQ查询运算符返回装饰器序列,并且此装饰启用了延迟执行 装饰器序列是另一个序列(在您的情况下为int[] )的包装,该序列也知道要对包裹的序列应用哪个查询。 实际执行发生在GetEnumerator().MoveNext()调用中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM