c# - LINQ 和内存分配

标签 c# linq memory-management linq-to-objects

在 LINQ 一词下的这个问题中,我指的是 LINQ to objects。

  1. 哪些 LINQ 方法会分配新内存,哪些不会?

  2. 比如Select(x => x)是否分配新内存?

  3. 如果 LINQ 中有不同的方法 - 一些分配内存而另一些不分配内存 - 我是否从内存效率的角度检查并考虑了 LINQ 链中的每个方法?那么使用 LINQ 不仅仅是简单地在 LINQ 链中添加任何方法是愚蠢的吗?因此,在链中使用它之前,我需要不断记住每个 LINQ 方法“功能”吗?换句话说,在内存效率方面是否没有使用 LINQ 的单一规则或模式(例如“LINQ 总是/不分配新内存”)?

最佳答案

MSDN for Enumerable.Select指定它“这个方法是通过使用延迟执行来实现的。立即返回值是一个对象,它存储了执行操作所需的所有信息。”因此,它至少为 lambda (x=>x) 和调用它的集合的引用分配内存。但是,这会按查询复杂度的顺序占用内存,不会按集合大小的顺序占用内存,因此应该几乎可以忽略不计。

只有在迭代查询结果时,才会按照集合大小的顺序分配内存。正如 Pareek 的链接所示,这通常在每个查询中发生一次。在 LINQ and Deferred Execution (即使它与 LINQ to SQL 相关)对此给出了一个很好的陈述:如果 LINQ 方法返回不同于 IEnumerable 的东西,它必须迭代集合并因此可能分配新内存(例如 ToList()、ToArray())但是不必(例如 Count())。

因此,如果您最终得到某种不是 IEnumerable 的集合,查询将按照生成的集合的大小顺序分配内存。

关于c# - LINQ 和内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48575582/

相关文章:

c# - 如何在用户控件中使用委托(delegate)和事件?

linq - LINQ-to-NHibernate FetchMany 的 where 子句?

c# - ManualResetEventSlim.Set() 并不总是解锁任务内的等待

c# - 我们如何检测 WIndows 8 中的系统音量?

c# - 如何等待所有后台线程完成(在 C# 中)?

linq - Entity Framework 和链接表问题

c# - 是否有用于 Where 和 Select 的 (T, int) 重载的 LINQ 语法?

linux - 谁安排/创建程序的不同段(堆栈、堆、代码段、数据段)

objective-c - 单元测试中的 Xcode 内存泄漏检测

c++ - 为什么数组有特殊的new和delete?