2014-06-18 182 views
-1

最近我正在做關於開發編輯器的項目, 爲什麼C#列表可以允許我使用ADD函數,但我不能通過索引 指定值可以任何人提供幫助嗎?C#索引超出範圍。必須是非負的,並小於集合的大小

+0

當您第一次嘗試按索引引用元素時,您的列表是否包含任何數據? – IrishGeek82

+1

你可以用'line.Substring(26)'替換'line.Substring(26,EndOfIndex)'。它會默認返回字符串的其餘部分 – cost

+0

我們無法訪問您的輸入,因此請嘗試設置一些中斷點並逐步完成代碼。如果問題不明顯,那麼讓我們知道哪一行正在拋出異常,以及當時各種變量的值是多少。 –

回答

2
List<List<String>> datalist = new List<List<String>>(); 
.... 
datalist[tag.Count-1]=datasublist; 

是一個問題,因爲你試圖分配一些不存在的東西。列表不像數組,它聲明瞭一個特定的大小,並可以使用你所做的任何部分。由於您已將datalist聲明爲一個沒有任何內容的新List,因此您無法更改任何內容。您需要使用

datalist.Add(datasublist); 

,不相關的一邊,正如我在評論中指出,可以更換

line.Substring(26, EndOfIndex) 

隨着

line.Substring(26) 

默認情況下將返回剩下的的字符串。也會讓你刪除EndOfIndex變量。

2

我假設的錯誤就行了:

datalist[tag.Count-1]=datasublist; 

乍一看它似乎我像你想Dictionary<int, List<string>>或更好,但也許Dictionary<string, List<string>>。在這種情況下,您既可以存儲值tag.Count - 1,也可以存儲剛添加的標籤的值。但是,第二個想法是在循環中重複上面的行,看起來你只是想將一串字符串添加到關聯列表中。


所以,我建議使用一個類來存儲標記名稱及其相關數據一起

class TagInfo 
{ 
    public string TagName {get; set;} 
    private readonly List<string> data = new List<string>(); 
    public List<string> Data {get {return data;}} 
} 

這將然後允許你這樣做:

List<TagInfo> tags = new List<TagInfo>(); 

while (line != null) 
{ 

    if (line.Substring(0, 26) == "CRDI-CONTROL %%LINES-BEGIN") 
    { 
     string tagName = line.Substring(26); 
     TagInfo tag = new TagInfo {TagName = tagName}; 
     tags.Add(tag); 

     line = reader.ReadLine(); 
     while (line.Substring(0, 24) != "CRDI-CONTROL %%LINES-END") 
     { 
      tag.Data.Add(line.Replace(" ", String.Empty)); 

      line = reader.ReadLine(); 
     } 
    } 

你可以如果您需要稍後按名稱查找標記,則可以更先進並使用Dictionary<string, TagInfo>。只需將標籤名稱存儲爲密鑰即可。你也許可以通過添加一個帶有標籤名稱的構造函數來清理代碼,或者甚至可以根據需要創建自己的代碼TagInfoCollection

+0

此行無法在我的程序中運行tag.Data.Add(line.Replace(「」,String .Empty)); – user3750656

相關問題