gpt4 book ai didi

c# - LINQ 和内存分配

转载 作者:行者123 更新时间:2023-12-05 05:17:51 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com