2013-04-09 97 views
1

我想填充列表如下图所示:列表<string>内存溢出异常

List<string> list_lines = new List<string>(); 
    for (double num = double.Parse(txtStart.Text); num < 99999999; num++) 
    { 
     list_lines.Add(num.ToString()); 
    } 

但这些代码在33,554,432导致错误,并且错误:
Out Of Memory Exception
我想通过这个清单的工作,有什么是替换那个还是我该如何解决这个错误?

在此先感谢

+0

在我的系统上,我的内存耗尽'33,554,432';用double和int尝试它,并且有或没有解析,但是它在所有情况下都停止在完全相同的迭代中。 – 2013-04-09 06:39:09

+0

亲爱的jhon,我用int来测试它。仍然有同样的错误。 – MoonLight 2013-04-09 06:40:37

+0

是的,我也是,那就是我写的。唯一给你更多空间的是放弃.ToString()并将值放入ints列表中而不是字符串中。但是,您仍然会用这些数字来用完内存。 – 2013-04-09 06:42:26

回答

3

如果你可以用IEnumerable的替代清单比你可以用下面的办法

static IEnumerable<string> Gen() 
    { 
     for (double num = 0; num < 99999999; num++) 
     { 
      yield return num.ToString(); 
     } 
    } 

所以基本上你不分配内存,与进一步的处理,你必须记住,你不能说像根() .ToArray()这会产生相同的问题。 如果你需要列表,这是行不通的。

0

您没有足够的内存!
循环预留内存的每一步。整个循环需要[99999999 * 99999999/2 * sizeof(double)] B.这真是个大数字

1

您可以进行一些内存优化。只做解析一次:

var parsed_number = double.Parse(txtStart.Text); 

List<string> list_lines = new List<string>(); 
for (double num = parsed_number; num < 99999999; ++num) 
{ 
    list_lines.Add(num.ToString()); 
} 

这可能有助于内存使用情况。

+0

我从循环中删除了parsed_number,在num中仍然有该错误 - > 33,554,432 – MoonLight 2013-04-09 06:42:47

0

如果你需要的数字,试试这个代码,而不是:

int startNumber = int.Parse(txtStart.Text); 
List<int> list_lines = new List<int>(); 

for (int i = startNumber; i < 99999999; i++) 
{ 
    list_lines.Add(i); 
} 

这将运行没有问题。如果您稍后需要将该数字作为字符串,则只需在检索它们时转换它们即可。

0

我建议约翰WILLEMSE的答案 - 整数比弦任何时候更快..

需要时就转换为字符串 - 检查您的方案这个链接,最好的方法(转换):

Better way to cast object to int