c# - LINQ IEnumerable 在底层是如何工作的?

标签 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 对象。 这与在 foreach 语句,例如 List?
  2. 与所有 IEnumerable 一样,内容是使用 foreach 语句迭代的。我的查询来自使用延迟执行 的 LINQ IEnumerables - 何时实际收集 IEnumerable 的内容?是在调用 GetEnumerator() 时吗?

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

最佳答案

您的两个问题密切相关。

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

关于c# - LINQ IEnumerable 在底层是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41443700/

相关文章:

c# - 为什么此 Linq to XML 查询不起作用

linq - 在任何情况下,LINQ 的 .Where() 会比 O(N) 快吗?

c# - 如何通过单选按钮列表显示图片?

c# - WPF 中的屏幕分辨率问题?

c# - WCF 抛出异常

c# - 为什么 Dispatcher.BeginInvoke 为 ThreadStart 解包 TargetInvocationException 而不是为 Action 解包?

c# - 错误 : The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

c# - 如何制作条件安装程序以在本地或联网计算机上查找或安装 SQL Server?

c# - OData、Web Api 2 和深度嵌套对象

c# - LINQ+Lambda 与标准索引器+foreach - 即使 MS 和 Lippert 也说索引器更好。那么在这种情况下呢?