C # цикл через массив - PullRequest
       38

C # цикл через массив

14 голосов
/ 09 марта 2010

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

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

Ответы [ 6 ]

23 голосов
/ 09 марта 2010

Просто увеличивайте 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 как верхнюю границу Это только маскирует ошибки в предварительных условиях.

7 голосов
/ 09 марта 2010

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

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

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

    } 
3 голосов
/ 09 марта 2010

Не так уж сложно.Просто увеличьте счетчик цикла 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];
}

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

2 голосов
/ 09 марта 2010

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

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

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

1 голос
/ 16 февраля 2016

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

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

}
1 голос
/ 09 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...