2011-11-18 12 views
11
for(int k=0;k <= odds.GetLength(-1);k++) 

Powyższy wiersz kodu ma powtarzać się przez dwuwymiarową tablicę typu Double, ale wciąż rzuca następujący wyjątek. Wyjątek poza zasięgiem. Czy ktoś byłby na tyle uprzejmy, aby wyjaśnić, dlaczego i zapewnić rozwiązanie. Wielkie dzięki.Powtórz 2-wymiarową tablicę C#

+0

Czy zmieniasz zawartość "kursów" w dowolnym punkcie pętli? – ChrisBint

+0

Myślę, że powinieneś dodać więcej kodu. Może możesz użyć foreach? –

+0

Tak w następujący sposób "code'win + = odds [1, k] * unitStake; "kod" – user995689

Odpowiedz

35

Przekazujesz nieprawidłowy indeks do GetLength. Wymiary wielowymiarowej tablicy są oparte na argumencie 0, więc jest ona niepoprawna, a użycie liczby ujemnej (lub liczby większej niż liczba wymiarów - 1) spowodowałoby powstanie IndexOutOfRangeException.

Ta pętla nad wymiarem pierwszy:

for(int k=0;k < odds.GetLength(0);k++) 

Trzeba dodać kolejną pętlę, aby przejść przez drugi wymiar:

for(int k=0;k < odds.GetLength(0);k++) 
    for(int l=0;l < odds.GetLength(1);l++) 
     var val = odds[k,l]; 
+0

Absolutnie fantastycznie! Dziękuję Ci bardzo! – user995689

+0

część warunkowa pętli powinna określać "<" zamiast "<=" lub wyjdzie z wyjątku indeksu. – John

+0

@John - dzięki. Mogłeś zasugerować tę edycję bezpośrednio :) – Oded

3

Jeśli odds jest dwuwymiarową tablicą, wtedy jego wymiary będą nazywane 0 i 1. Próba dostępu do wymiaru -1 przyniesie IndexOutOfRangeException.

1

GetLength jest oparty na zera. Spróbuj zadzwonić pod numer GetLength(0).

3

Cóż, przeważnie kiedy chcesz iteracyjne na tablicy 2D:

for(int col = 0; col < arr.GetLength(0); col++) 
    for(int i = row; row < arr.GetLength(1); row++) 
     arr[col,row] = /*something*/; 

Tablice są zawsze od zera, więc nie ma sensu próbować uzyskać coś na -1 indeksu.

0

widzę jeden lub dwa problemy zależności od tego jak zamierzasz go używać:

pierwsze, GetLength (ind wymiar) zwraca długość określonego wymiaru, począwszy od 0. W przypadku dwuwymiarowej tablicy, poprawne indeksy będą wynosić 0 i 1.

Drugi problem polega na tym, że robisz < = zamiast < dla warunku pętli, który może również wyjść poza granice, ponieważ ostatni indeks to długość-1, a nie długość.

StriplingWarrior i Gilad Naaman zamieszczali przykłady kodu, więc pominę to.

+0

Dziękuję za wskazanie problemu z <= do tej pory nie było to widoczne z innym problemem, ale teraz Twój komentarz pomógł. Ty. – user995689

2
string[,] arr = new string[2, 3]; 
     arr[0, 0] = "0,0"; 
     arr[0, 1] = "0,1"; 
     arr[0, 2] = "0,2"; 

     arr[1, 0] = "1,0"; 
     arr[1, 1] = "1,1"; 
     arr[1, 2] = "1,2"; 

     for (int i = 0; i < arr.GetLength(0); i++) 
     { 
      for (int j = 0; j < arr.GetLength(1); j++) 
      { 
       Response.Write(string.Format("{0}\t", arr[i, j])); 
      } 
      Response.Write("<br/>"); 
     }