扩展 Enumerable.Range [重复]

Posted

技术标签:

【中文标题】扩展 Enumerable.Range [重复]【英文标题】:Extend Enumerable.Range [duplicate] 【发布时间】:2012-02-03 01:16:43 【问题描述】:

可能重复:Enumerable.Range implementation

我遇到了一个问题,我需要将一个很长的值 (Int64) 添加到列表中,该值是 600851475143,我想创建一个 List<Int64>,其中包含该值之前的所有 int,但是 @ 987654326@ 有一个限制,即在 count 参数中,它只接受 int 值,因为我离那个值很远,我决定循环遍历列表和所有这些值,但是我的系统很快就会耗尽内存,我应该怎么办怎么办?

List<int64> lst = new List<int64>();

for (Int64 i = 3; i < 600851475143; i=i+2)

    lst.Add(i);

谢谢

【问题讨论】:

你应该解释你真正想要做什么,因为你不可能真的需要一个 5TB 的 600B 个数字的数组! 这真的是个好主意吗?你知道这个列表会占用4.37 terabytes 的内存吗? 您的系统是否有 600,851,475,143 x 8 字节 = 我相信 ~6 TB 的 RAM?如果不是,那你为什么不指望这会填满你的记忆呢? 好的,我想做的是,得到这个数的最大素数,我的应用程序正在创建所有这些素数的另一个列表,为了得到我使用的算法的素数“埃拉托色尼的筛子”mathforum.org/dr.math/faq/faq.prime.num.html 对于一个筛子,您只需要 600,851,475,143 bits,如果不存储偶数,则只需要一半。当然,你最终还是需要 38GB 的​​内存,所以你需要选择不同的算法! 【参考方案1】:

正如 cmets 中所指出的,如此大的数组将需要大量内存。例如,更好的选择是为自己创建一个枚举器来循环遍历范围。开始查看此页面以了解如何:http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx :-)

【讨论】:

是的,这听起来是个绝妙的主意,我将删除所有可以被我之前的素数整除的值,

以上是关于扩展 Enumerable.Range [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Enumerable.Range 实现 IDisposable?

Enumerable.Range 的高内存消耗?

为啥 Enumerable.Range 比直接 yield 循环快?

使用 Enumerable.Range() 填充字典的问题

关于 Enumerable.Range 与传统 for 循环的 foreach 的思考

从 Enumerable.Range 或 List<int> 填充 List<dynamic>