You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集合遍历VS枚举器使用:内存中Range的最优实现方案选择

问题分析与方案选择

原代码

var range = Enumerable.Range(0, 1000);

foreach (var i in new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })
{
    foreach (var r in range)
    {
        var d = range.Contains(i);
    }
}

已知range变量的内容已加载至内存中,请问以下哪种方案更合适?

  • 保留迭代器实现var range = Enumerable.Range(0, 1000);,让其执行10次
  • 转换为集合实现var range = Enumerable.Range(0, 1000).ToArray();,在已创建的集合上调用Contains方法

方案选择:选第二种转换为集合的实现

理由如下:

  1. 迭代器的重复生成开销:Enumerable.Range返回的是延迟执行的迭代器,每次遍历(比如内层的foreach (var r in range))或者调用Contains方法时,都会重新生成从0到999的序列。原代码中外层循环10次,内层每次遍历又会触发一次迭代生成,Contains调用也会再触发一次,重复生成序列的额外开销会非常大。
  2. 集合的单次生成复用:转换为数组后,Enumerable.Range(0,1000)只会执行一次,生成的数组会常驻内存。后续所有的遍历和Contains调用都是直接操作内存中的数组,避免了重复生成序列的成本,哪怕Contains还是线性查找,整体性能也会远高于迭代器方案。
  3. 适配多次复用场景:当前代码是对同一个序列进行多次重复操作,提前将序列固化为内存集合,完全匹配这类场景的性能优化需求。

内容的提问来源于stack exchange,提问作者Nick Farsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:45:34