2013-08-24 50 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)); 
} 
相關問題