2012-06-26 13 views
5

Estoy usando una matriz int para contener una larga lista de enteros. Para cada elemento de este conjunto, quiero verificar si es 1, si es así, solo lo relevante para 1, si es un 2, hago otras cosas relevantes para 2, y así sucesivamente para cada valor almacenado en el conjunto. Se me ocurrió el siguiente código pero no funciona como se esperaba, ¿hay algo que me falta? Lo que está sucediendo es que solo se está considerando el primer valor de la matriz.Ciclismo a través del contenido del número de matriz

int[] variable1 = MyClass1.ArrayWorkings(); 
foreach (int i in variable1) 
{ 
    if (variable1[i] == 1) 
    { 
     // arbitrary stuff 
    } 
    else if (variable1[i] ==2) 
    { 
     //arbitrary stuff 
    } 
} 

Respuesta

4

Está tratando de hacer algo que no tiene sentido. Para ver cómo funciona, poner un ejemplo sencillo, una matriz con valores: 9, 4, 1.

Si intenta ejecutar el código en esta matriz de muestras, obtendrá un error:

foreach (int i in variable1) 
{ 
    if (variable1[i] == 1) // the item i is 9. 
          // But variable[i] means, get the value at position #9 in the array 
          // Since there are only 3 items in the array, you get an Out Of Range Exception 
    { 
     // arbitrary stuff 
    } 
{ 

en su lugar, esto es lo que necesita:

foreach (int i in variable1) // i will be 9, then 4, then 1) 
{ 
    if (i == 1) 
    { 
     // arbitrary stuff 
    } 
    // ... etc 
} 

La alternativa es usar un para bucle, lo que le daría los índices 0, 1 y 2, así:

for (int i=0 ; i<=variable1.Length ; i++) // i will be 0, 1, 2 
              // variable[i] will be 9, 4, 1 
{ 
    if (variable1[i] == 1) 
    { 
     // stuff 
    } 

    // ... etc 
} 
+0

Quieres decir 'i == 1', ¿verdad? –

+0

@FilipEkberg gracias, sí. Yo apesta – McGarnagle

+0

Eso tiene sentido, sin embargo, después de cambiar el código (para (int i = 0; i <= variable1.Length; i ++) ) todavía está considerando el primer elemento – user1166981

8

El i en su circuito foreach contiene el valor real del elemento de la matriz en cada iteración, no en el índice. En su muestra de código particular, su matriz probablemente contiene solo ceros, por lo que solo obtiene el primer elemento (siempre usa el índice 0). Por lo tanto, debe marcar i en lugar de variable1[i].

Si va a comprobar contra diversas constantes enteras, una expresión switch es más adecuado, por cierto:

foreach (int i in variable1) { 
    switch (i) { 
     case 1: 
      // arbitrary stuff 
      break; 
     case 2: 
      // arbitrary stuff 
      break; 
    } 
} 

switch/case le ahorra algo escrito; si alguna vez extrae sus valores de cualquier lugar que no sea i, simplemente puede cambiar la parte (i) en la declaración switch, y además, switch puede ser evaluado por el compilador de manera más eficiente que las declaraciones encadenadas if - else.

Nota: Usted no será capaz de cambiar directamente los valores de la matriz en el bucle foreach, ya que no se puede asignar a cualquier cosa i. Si necesita asignar nuevos valores de la matriz, que tendrá que

  • contar usted mismo con una variable adicional sin dejar de utilizar foreach o
  • utilizar otro bucle como for y recuperar el elemento en el índice actual de sí mismo.
2

Escribir esta forma:

foreach (int i in variable1) { 
    if (i == 1) { 
    .... 
0

El i que no es inverosímil que el índice pero el valor. Por lo tanto, marque i con 1 o 2.

Si estaba usando for loop entonces su código interno habría funcionado perfectamente.

int[] variable1 = MyClass1.ArrayWorkings(); 
foreach (int i in variable1) 
{ 
    switch(i) 
    { 
     case 1: 
      // arbitrary stuff 
     break; 
     case 2: 
      //arbitrary stuff 
     break; 
    } 
} 

Probar el uso de la caja del interruptor. Mucho más rápido de lo normal if-else.

Cuestiones relacionadas