2012-10-25 56 views
0

我在我的程序中拋出索引超出綁定異常在 行yearList.SetValue(年[count],計數)下面的代碼;索引越界異常在C#

protected void invoiceYear_DataBound(object sender, EventArgs e) 
     { 
      //invoiceYear.SelectedItem.Value= GetYearRange(); 
      String[] years = GetYearRange().Split(new char[] { '[', ',', ']',' ' }); 
      ListItem [] yearList = new ListItem[]{}; 
      System.Diagnostics.Debug.WriteLine("years-->" + years.Length); 
      for (int i = 0; i < years.Length; i++) 
      { 
       System.Diagnostics.Debug.WriteLine("years-->" + years.GetValue(i)); 

      } 
      int count = 0; 
      foreach (String str in years) 
      { 
       if (string.IsNullOrEmpty(str)) 
        System.Diagnostics.Debug.WriteLine("empty"); 
       else 
       { 
        yearList.SetValue(years[count], count); 
        count++; 
       } 
      } 

      //System.Diagnostics.Debug.WriteLine("yearList-->" + yearList.GetValue(0)); 
      //invoiceYear.Items.AddRange(yearList); 
     } 
+0

您還沒有真正問過問題。您可能希望更新信息以包含問題。 –

+0

您是否嘗試過調試以查看** count **的值在使用它訪問* years *數組時的值? –

+0

嘗試做計數-1 –

回答

7

你還沒有問過一個問題,所以我會猜你的問題只是「爲什麼?」。

yearList被定義爲一個空數組:

ListItem [] yearList = new ListItem[]{}; 

它的長度始終爲零。因此你不能設置它的任何元素,因爲它沒有要設置的元素。

UPDATE

現在,您已經問道:「可是我沒有得到如何聲明一個動態數組?」在.NET中不存在動態數組。根據您的場景,您有許多不同的集合類型。我會建議List<ListItem>可能是你想要的。

List<ListItem> yearList = new List<ListItem>(); // An empty list 

然後

yearList.Add(years[count]); // Adds an element to the end of the list. 

或者,整個循環,可以更好地寫爲:

 foreach (String str in years) 
     { 
      if (string.IsNullOrEmpty(str)) 
       System.Diagnostics.Debug.WriteLine("empty"); 
      else 
      { 
       yearList.Add(str); 
      } 
     } 

這樣,你就不必擔心count,並也不是你失控的步驟(因爲你只是增加計數,當str包含的東西 - 這可能不是你想要的)

更新2 如果你迫切確實需要在最後一個數組,你總是可以隱蔽在列表中使用yearList.ToArray()一個數組,但記得要在你的文件的頂部添加using System.Linq;,因爲它是一個擴展方法LINQ提供而不是List類本身的一部分。

+0

我的問題是我越來越索引超出界限例外。我不知道爲什麼所以你是正確的..是啊..如何在這裏聲明一個動態數組?請建議 – Naga

+0

答案已更新。 –

+0

感謝科林,它解決了我的問題......但一個更正,我們不能添加字符串列表項目..我反正計算出 – Naga

0

爲什麼使用Foreach循環時,如果你想保持計數器只能使用For

 foreach (var int i = 0; i < years.Length; i++) 
     { 
      if (string.IsNullOrEmpty(years[i])) 
       System.Diagnostics.Debug.WriteLine("empty"); 
      else 
      { 
       yearList.SetValue(years[i], i); 
      } 
     } 
+0

我也使用過這個..但同樣的問題..所以我轉移到foreach ..但那力量幫助.. so .. – Naga

+0

好@ColinMackay解釋了你的問題,並給了你答案,但我只是說這是不好的,你沒有使用提供的工具。 – Mayank

+0

我力求得到你嗎?我做了什麼?? – Naga

0

我不知道你的目標是什麼,我沒有與任何ListItem的經驗,但你有沒有考慮這種方法:

string[] yearList = years.Where(y => !string.IsNullOrEmpty(y)).ToArray(); 

這將創建這些年來的數組不是空的或空的。這也取決於你是如何使用列表來判斷這是否有用。如果它並不需要是一個數組,那麼你甚至可以做到這一點,而不是:

var yearList = years.Where(y => !string.IsNullOrEmpty(y)); 

注意,這些解決方案不這樣做你的代碼確實在診斷輸出或使用ListItem的條款到底是什麼。它也取決於你使用的.net版本是否適合你。