LINQ IEnumerable如何在幕后工作?

时间:2017-01-03 12:35:52

标签: c# .net linq ienumerable enumerable

阅读各种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对象。 这与a中使用的任何其他IEnumerable对象没有什么不同 foreach声明,例如List?
  2. 与所有IEnumerables一样,使用foreach语句迭代内容。我的查询来自LINQ IEnumerables使用延迟执行 - IEnumerable的内容何时实际收集?是在调用GetEnumerator()时?
  3. 对于问题2,我的假设是从LINQ查询生成的对象在GetEnumerator函数中生成代码,该函数以我们的LINQ语法表示的方式检索数据。只是我猜...除非我在想LINQ完全错误......

1 个答案:

答案 0 :(得分:0)

你的两个问题密切相关。

所以,是的,存在差异。 LINQ查询运算符返回装饰器序列,此装饰启用延迟执行装饰器序列是另一个序列(在您的情况下为int[])的包装器,它也知道要对包装序列应用哪个查询。 实际执行发生在GetEnumerator().MoveNext()电话。