2012-10-25 3 views
0

라인 yearList.SetValue (years [count], 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

* years * 배열에 액세스 할 때 ** count ** 값을 확인하려면 디버깅을 시도 했습니까? –

+0

count -1을 시도해보십시오. –

답변

7

질문하지 않았으므로 귀하의 질문은 "왜?"라고 추측 할 것입니다.

yearList는 하늘의 배열과 같이 정의된다

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

그것의 길이는 항상 0입니다. 따라서 설정할 요소가 없으므로 요소를 설정할 수 없습니다.

UPDATE

이제 요청했습니다 : "하지만 동적 배열을 선언하는 방법을 못하고 있어요?"

.NET에는 동적 배열이 없습니다. 시나리오에 따라 다양한 컬렉션 유형이 있습니다. List<ListItem>이 아마도 당신이 원하는 것이라고 제안 할 것입니다. 당신이 count에 대해 걱정할 필요하지 않는 그런

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

및 없으며에서 점점 :

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

그런 다음

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

또는 그 전체 루프를 더 잘 쓸 수있다 step (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 ..하지만 그 도움이 ... .. – Naga

+0

잘 @ColinMackay는 당신에게 문제를 설명하고 대답을 주었지만, 나는 당신이 제공된 도구를 사용하지 않는 것이 좋지 않다는 것을 말하고있었습니다. – Mayank

+0

내가 너를 잡을거야? 내가 무슨 짓을 한?? – Naga

0
나는 당신의 목적이 무엇인지 모른다, 나는 ListItem과 경험이 있지만,이 방법 고려하지 않아도

:이 모든 년의 배열을 생성

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

을 null 또는 공백이 아닌 또한 이것이 유용한 지에 대한 목록을 어떻게 소비하는지에 따라 다릅니다. 이 배열이 필요하지 않는 경우, 당신도 대신 할 수있다 :이 솔루션은 코드가 진단 출력 또는 ListItem의 이용 약관에서와 정확히 일을하지 않는 것이

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

참고. 또한이 버전이 당신에게 어떤 옵션인지 여부에 따라 사용중인 .net의 버전에 따라 다릅니다.

관련 문제