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

Se supone que la línea de código anterior itera a través de una matriz bidimensional de tipo Doble, pero sigue arrojando la siguiente excepción. Excepción de índice fuera de rango. ¿Alguien sería tan amable de explicar por qué y ofrecer una solución? Muchas gracias.Iterar a través de una matriz de 2 dimensiones C#

+0

¿Está cambiando los contenidos de 'odds' en cualquier punto del ciclo? – ChrisBint

+0

Creo que deberías agregar más código. ¿Tal vez puedas usar un foreach? –

+0

Sí de la siguiente manera 'code'win + = odds [1, k] * unitStake; 'código' – user995689

Respuesta

35

Estás pasando un índice no válido al GetLength. Las dimensiones de una matriz multidimensional están basadas en 0, por lo que -1 no es válido y el uso de un número negativo (o un número mayor que el número de dimensiones - 1) provocaría un IndexOutOfRangeException.

Este bucle sobre la dimensión primera:

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

Es necesario añadir otro bucle para ir a través de la segunda dimensión:

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

¡Absolutamente fantástico! ¡Muchas gracias! – user995689

+0

la parte condicional de los bucles debe especificar '<' en lugar de '<=' o saldrá de la excepción del índice. – John

+0

@John - gracias. Podrías haber sugerido que editas directamente :) – Oded

3

Si odds es una matriz de dos dimensiones, entonces sus dimensiones se llamarán 0 y 1. Si intenta acceder a la dimensión -1 obtendrá un IndexOutOfRangeException.

1

GetLength tiene base cero. Intenta llamar al GetLength(0).

3

Bueno, usualy cuando se quiere iterar sobre una matriz 2D:

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

matrices son siempre basado en cero, así que no hay punto de tratar de obtener algo a -1 índice.

0

I ver uno o dos problemas dependiendo de cómo se vaya a usar:

En primer lugar, GetLength (ind dimensión) devuelve la longitud de dimensión especificada, a partir de 0. En caso de una matriz de dos dimensiones, los índices correctos serían 0 y 1.

El segundo problema es que usted está haciendo < = en lugar de < para la condición de bucle, que también podría salirse de límites ya que el último índice es de longitud-1 y no de longitud.

StriplingWarrior y Gilad Naaman publicaron ejemplos de código, así que me saltearé eso.

+0

Gracias por señalar el problema con <= no fue aparente hasta ahora con el otro problema que tuve, pero ahora tu comentario ha ayudado. 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/>"); 
     } 
Cuestiones relacionadas