2010-03-09 6 views
11

Я перебираю массив строк, например (1/12/1992 яблочный грузовик 12/10/10 оранжевый велосипед). Длина массива всегда будет делиться на 3. Мне нужно пройти через массив и захватить первые 3 элемента (я собираюсь вставить их в БД), а затем захватить следующие 3 и так далее и так далее, пока все они прошли.C# петля через массив

//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

Какой вопрос? –

+2

5 ответов, отправленных в течение 40 секунд друг от друга, все с одинаковой (почти точной) информацией. Ха-ха. Ницца. – JasCav

+2

То, что я нахожу интересным, состоит в том, что пять ответов были опубликованы, когда я писал мой ... и * ни один из них * не получил верхнюю границу справа. –

ответ

20

Просто увеличивает i по 3 в каждом шаге:

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 
    } 

Чтобы ответить на некоторые комментарии, это не данность, что theData.Length кратно 3, так что нет необходимо проверить на theData.Length-2 как верхний. Это будет только маскировать ошибки в предварительных условиях.

+0

хороший момент, чтобы прокомментировать ваше издание – Javier

7

i++ является стандартным использованием цикла, но не единственным способом. Попробуйте приращение по 3 каждый раз:

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

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

    } 
+3

Вы до сих пор единственный, кто не получит ошибку на последней итерации; вместо этого вы останавливаете одну итерацию короткими. Попробуйте 'i

+0

@mmyers - великие мысли думают одинаково. :) Изменен уже.Но я не думаю, что проверка нужна в любом случае, только положите ее, потому что это кажется логичным ... – froadie

+1

+1 для связанной проверки по длине! – FrustratedWithFormsDesigner

3

Не слишком сложно. Просто приращение счетчика цикла for на 3 каждой итерации, а затем компенсировать индексатор, чтобы получить порцию 3 в то время:

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

Если длина массива не garuanteed быть кратно трем , вам нужно будет проверить верхнюю границу с помощью theData.Length - 2.

2

Для вашего цикла не нужно просто добавить его. Вы можете зацикливаться на три.

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

В принципе, вы используете индексы для захвата значений в вашем массиве. Один момент, который следует отметить здесь, я не проверяю, проходите ли вы мимо конца вашего массива. Убедитесь, что вы выполняете проверку границ!

+0

Downvote? Зачем? (Я заметил, что все ответы, кроме первого, были опущены. Lame.) – JasCav

+0

первый изначально был, но, похоже, был снят. Странный. – froadie

1

Это должно работать:

//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]; 
} 

Я downvoted за этот ответ один раз. Я уверен, что это связано с использованием theData.Length для верхнего. Код как работает отлично, потому что, как утверждается, массив гарантированно будет кратным трем. Если эта гарантия не была на месте, вам нужно будет проверить верхнюю границу с помощью Data.Length - 2.

1

Вот более общее решение:

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 
     } 
    } 

} 
Смежные вопросы