2013-08-24 30 views
-3

我遇到了ArgumentOutOfRangeException。它涉及到在一段代码如下:列表<>似乎不能包含超过500个项目

public static void readPuzzle() 
{ 
    List<int> conversion = new List<int>(factor * factor * factor * factor); 
    int count = 0; 
    using (StreamReader codeString = new StreamReader(path)) 
    { 
     String line = codeString.ReadToEnd(); 
     String[] split = line.Split(','); 
     foreach (String a in split) 
     { 
      conversion.Add(Convert.ToInt32(a)); 
     } 
     for (int panelX = 0; panelX < factor; panelX++) 
     { 
      for (int panelY = 0; panelY < factor; panelY++) 
      { 
       values[panelX, panelY] = new int[factor, factor]; 
       for (int squareX = 0; squareX < factor; squareX++) 
       { 
        for (int squareY = 0; squareY < factor; squareY++) 
        { 
         values[panelX, panelY][squareX, squareY] = conversion[count]; 
         count++; 
        } 
       } 
      } 
     } 
    } 
} 

指示的行是:

values[panelX, panelY][squareX, squareY] = conversion[count]; 

我相信这是在参考List<>转换的索引。当计数为500并且索引为[499]时,代码停止运行。我现在已经手动将列表大小设置为625(因子= 5),它应该完全是列表中的项目数量。它似乎没有任何区别。我读过其他人的问题,他们提到了超过一百万件物品的清单,所以我不明白为什么我会遇到这个问题。任何帮助,将不胜感激。

+2

检查'split'的大小以查看实际添加到列表中的元素数量。 – MAV

+3

定义值在哪里?它是什么? – dcaswell

+0

难道是你正在阅读的文件只有500行吗?列表的构造函数参数不会填充列表,它仅为625预留空间,仅作为速度/内存优化。 – 2013-08-24 21:00:19

回答

3

从我可以看到它好像:

foreach (String a in split) 
{ 
    conversion.Add(Convert.ToInt32(a)); 
} 

必须只加入500项目,那么你想访问一个元素超出了

+0

哦,我的上帝,你是对的!我似乎忘了在我正在阅读的文本文件中放入125个项目。尝试了我准备的另一个文件,它运行得很好。非常感谢你。 – Rainier

+1

@MthethewMcveig:我很难理解你的答案。但它可能是正确的。这与数组初始化的容量完全无关。这只是一个指示性数字。这与多少元素有效地被添加有关。事实上,数组列表太短,不会太长。 – Codo

+0

@Codo可以自由编辑它并使其更清晰,我的回答是代码块只增加了500个项目,后来他访问了一个元素 –

0

我想你错过了,在文件的每一行结尾处:

String line = codeString.ReadToEnd(); 
String[] split = line.Split(new string[] { "\r\n", "," }, StringSplitOptions.None); 
foreach (String a in split) 
{ 
    conversion.Add(Convert.ToInt32(a)); 
} 
相关问题