2016-02-27 4 views
0

Мне было интересно, можно ли как-то добиться следующего псевдо-кода. У меня есть 4 списка с индексами разных размеров, поэтому нельзя использовать один и тот же счетчик ссылок. Мне нужно запустить четыре одновременно, чтобы я мог добавлять детали в datagridview в одну строку.За цикл, Несколько счетчиков

  for (int m = 0, n = 0, p = 0, q = 0; m <= coords_Count, n <= outer_plf_Count, p <= planet_start_plf_Countt, q <= planet_plf_Count, m++, n++, p++, q++) 
      { 
       dataGridView1.Rows.Add(
       block_coords_list[m][(int)Coords.X],  //Column 1 
       block_coords_list[m][(int)Coords.Y],  //Column 2 
       block_coords_list[m][(int)Coords.Z],  //Column 3 
       outer_plf_list[n][(int)Outer_plf.Hash],  //Column 4 
       outer_plf_list[n][(int)Outer_plf.X],  //Column 5 
       outer_plf_list[n][(int)Outer_plf.Y],  //Column 6 
       outer_plf_list[n][(int)Outer_plf.Z],  //Column 7 
       outer_plf_list[n][(int)Outer_plf.OrbitName],  //Column 8 
       outer_plf_list[n][(int)Outer_plf.PrefabName],  //Column 9 
       planet_start_plf_list[p][(int)Planet_Start_plf.X], //Column 10 
       planet_start_plf_list[p][(int)Planet_Start_plf.Y], //Column 11 
       planet_start_plf_list[p][(int)Planet_Start_plf.Z], //Column 12 
       planet_start_plf_list[p][(int)Planet_Start_plf.PlanetName], //Column 13 
       planet_start_plf_list[p][(int)Planet_Start_plf.PlanetBiome], //Column 14 
       planet_start_plf_list[p][(int)Planet_Start_plf.StartTrue], //Column 15 
       planet_plf_list[q][(int)Planet_plf.X],  //Column 16 
       planet_plf_list[q][(int)Planet_plf.Y],  //Column 17 
       planet_plf_list[q][(int)Planet_plf.Z],  //Column 18 
       planet_plf_list[q][(int)Planet_plf.PlanetaryBodyName], //Column 19 
       planet_plf_list[q][(int)Planet_plf.PrefabName]);   //Column 20 
      } 
+2

Я DON» Думаю, вам нужны четыре счетчика. Я имею в виду, что вы увеличиваете счетчики одинаково каждый раз, когда вы зацикливаете, так что вы, вероятно, можете обойтись одним. Не хватает ли некоторых деталей вашей реализации? – kondrak

+0

Если я увеличиваю их все с помощью одного и того же счетчика, я получу исключение, потому что некоторые из индексов имеют длину 4 и некоторые из 8 и некоторые 6. В моем datagrid я просто заполняю их пустым пространством, если нет данных –

+0

If индексы имеют разные максимумы, цикл for все равно будет работать до тех пор, пока ** все ** индексы не достигнут своего максимума ... Имея 4 или имеющий 1, ваш код делает то же самое. Вы все равно получите IndexOutOfRange ... Просмотрите свою логику. –

ответ

3

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

Лучше всего иметь один condition, который идет для самого длинного массива и использовать тройной оператор ?: в каждой колонке, чтобы избежать доступа ничего, если это за пределами диапазона данных этого столбца:

int a0Max = block_coords_list.Length; 
int a1Max = outer_plf_list.Length; 
int a2Max = planet_start_plf_list.Length; 
int a3Max = planet_plf_list.Length; 
int max = new Int32[] { a0Max, a1Max, a2Max, a3Max }.Max(); 

for (int i = 0; i < max, i++) 
{ 
    dataGridView1.Rows.Add(
     i < a0Max ? block_coords_list[i][(int)coords.X] : null, 
     i < a0Max ? block_coords_list[i][(int)coords.Y] : null, 
     i < a0Max ? block_coords_list[i][(int)coords.Z] : null, 
     i < a1Max ? outer_plf_list[i][(int)outer_plf.Hash] : null, 
     i < a1Max ? outer_plf_list[i][(int)outer_plf.X] : null, 
     i < a1Max ? outer_plf_list[i][(int)outer_plf.Y] : null, 
     i < a1Max ? outer_plf_list[i][(int)outer_plf.Z] : null, 
     i < a1Max ? outer_plf_list[i][(int)outer_plf.OrbitName] : null, 
     i < a1Max ? outer_plf_list[i[(int)outer_plf.PrefabName] : null, 
     i < a2Max ? planet_start_plf_list[i][(int)planet_Start_plf.X] : null, 
     i < a2Max ? planet_start_plf_list[i][(int)planet_Start_plf.Y] : null, 
     i < a2Max ? planet_start_plf_list[i][(int)planet_Start_plf.Z] : null, 
     i < a2Max ? planet_start_plf_list[i][(int)planet_Start_plf.PlanetName] : null, 
     i < a2Max ? planet_start_plf_list[i][(int)planet_Start_plf.PlanetBiome] : null, 
     i < a2Max ? planet_start_plf_list[i][(int)planet_Start_plf.StartTrue] : null, 
     i < a3Max ? planet_plf_list[i][(int)planet_plf.X] : null, 
     i < a3Max ? planet_plf_list[i][(int)planet_plf.Y] : null, 
     i < a3Max ? planet_plf_list[i][(int)planet_plf.Z] : null, 
     i < a3Max ? planet_plf_list[i][(int)planet_plf.PlanetaryBodyName] : null, 
     i < a3Max ? planet_plf_list[i][(int)planet_plf.PrefabName] 
    ); 
} 
+0

Ваш код выше для меня новичок, но очень интересный. Спасибо, что разоблачил меня. Мне нужно еще раз прочитать это, чтобы понять его полностью. –

+0

@ Дай Я предлагаю переместить тернарный чек на частный метод, чтобы избежать немного многословия. Лучше увековечить хорошие методы кодирования;) – kondrak

+0

@kondrak Перемещение тернарной функции будет сделать ее более уродливой, так как мы не хотим, чтобы с нетерпением-оценки аргументов (что могло бы вызвать исключение границ) и накладных расходов на лямбда-вызов (единственное способ избежать высокой оценки в настоящее время). – Dai

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