2010-03-09 17 views
11

Estoy recorriendo una serie de cadenas, como (1/12/1992 apple truck 12/10/10 orange bicycle). La longitud de la matriz siempre será divisible por 3. Necesito recorrer la matriz y agarrar los primeros 3 elementos (los insertaré en una base de datos) y luego tomaré los siguientes 3 y así sucesivamente hasta que todos ellos han sido atravesados.C# bucle a través de una matriz

//iterate the array 
for (int i = 0; i < theData.Length; i++) 
{ 
    //grab 3 items at a time and do db insert, continue until all items are gone. 'theData' will always be divisible by 3. 
} 
+3

¿Cuál es la pregunta? –

+2

5 respuestas enviadas dentro de los 40 segundos una de la otra, todas con la misma información (casi exacta). Jaja. Bonito. – JasCav

+2

Lo que me parece interesante es que se publicaron cinco respuestas mientras escribía las mías ... y * ni una sola * obtuvo el límite superior a la derecha. –

Respuesta

20

sólo se incrementa i por 3 en cada paso:

Debug.Assert((theData.Length % 3) == 0); // 'theData' will always be divisible by 3 

    for (int i = 0; i < theData.Length; i += 3) 
    { 
     //grab 3 items at a time and do db insert, 
     // continue until all items are gone.. 
     string item1 = theData[i+0]; 
     string item2 = theData[i+1]; 
     string item3 = theData[i+2]; 
     // use the items 
    } 

Para responder a algunos comentarios, es un hecho que theData.Length es un múltiplo de 3 lo que no hay necesita verificar theData.Length-2 como un límite superior. Eso solo enmascararía los errores en las condiciones previas.

+0

buen punto para comentar sobre su edición – Javier

7

i++ es el uso estándar de un bucle, pero no la única. Trate por incremento a 3 cada vez:

for (int i = 0; i < theData.Length - 2; i+=3) 
    { 

     // use theData[i], theData[i+1], theData[i+2] 

    } 
+3

Eres el único hasta ahora que no recibirá un error fuera de límites en la última iteración; en cambio, detiene una iteración corta. Pruebe 'i

+0

@mmyers - las mentes geniales piensan igual. :) Ya lo cambió.Pero no creo que el cheque sea necesario de todos modos, solo colóquelo porque parecía lógico ... – froadie

+1

+1 para verificación encuadernada de la longitud. – FrustratedWithFormsDesigner

3

No es demasiado difícil. Sólo incrementar el contador del bucle for por 3 cada iteración y luego compensar el indexador para obtener el lote de 3 a la vez:

for(int i=0; i < theData.Length; i+=3) 
{ 
    var item1 = theData[i]; 
    var item2 = theData[i+1]; 
    var item3 = theData[i+2]; 
} 

Si la longitud de la matriz no se garuanteed ser un múltiplo de tres , necesitaría verificar el límite superior con theData.Length - 2 en su lugar.

2

Su bucle for no necesita solo agregar uno. Puedes recorrer por tres.

for(int i = 0; i < theData.Length; i+=3) 
{ 
    string value1 = theData[i]; 
    string value2 = theData[i+1]; 
    string value3 = theData[i+2]; 
} 

Básicamente, usted está usando índices para agarrar los valores en la matriz. Un punto a tener en cuenta aquí, no estoy comprobando si pasa más allá del final de su matriz. ¡Asegúrate de que estás haciendo límites comprobando!

+0

¿Votación negativa? ¿Para qué? (Noté que todas las respuestas excepto la primera fueron downvoted. Lame.) – JasCav

+0

la primera fue originalmente, pero parece que se quitó. Extraño. – froadie

1

Esto debería funcionar:

//iterate the array 
for (int i = 0; i < theData.Length; i+=3) 
{ 
    //grab 3 items at a time and do db insert, continue until all items are gone. 'theData' will always be divisible by 3. 
    var a = theData[i]; 
    var b = theData[i + 1]; 
    var c = theData[i + 2]; 
} 

He estado downvoted para esta respuesta una vez. Estoy bastante seguro de que está relacionado con el uso de DaDa.Length para el límite superior. El código como funciona bien porque se garantiza que la matriz es un múltiplo de tres como dice la pregunta. Si esta garantía no estaba en su lugar, necesitaría verificar el límite superior con theData.Length - 2 en su lugar.

1

Aquí es una solución más general:

int increment = 3; 
for(int i = 0; i < theData.Length; i += increment) 
{ 
    for(int j = 0; j < increment; j++) 
    { 
     if(i+j < theData.Length) { 
     //theData[i + j] for the current index 
     } 
    } 

} 
Cuestiones relacionadas