2012-06-26 3 views
5

Я использую массив int для хранения длинного списка целых чисел. Для каждого элемента этого массива я хочу проверить, является ли оно 1, если это так, что имеет значение только для 1, иначе если это 2, сделайте другой материал, относящийся к 2, и так далее для каждого значения, хранящегося в массиве. Я придумал код ниже, но он работает не так, как ожидалось, есть ли что-то, что мне не хватает? Случается, что рассматривается только первое значение массива.С помощью содержимого массива

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

ответ

4

Вы пытаетесь сделать что-то, что не имеет смысла. Чтобы увидеть, как это работает, рассмотрим простой пример, массив со значениями: 9, 4, 1.

Если вы пытаетесь запустить свой код на этом массиве образца, вы получите сообщение об ошибке:

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

Вместо этого это то, что вам нужно:

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

альтернативой является использование для цикла, который даст вам индексы 0, 1, и 2, как это:

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

Вы имеете в виду 'i == 1', правильно? –

+0

@FilipEkberg спасибо, да. Я сосать. – McGarnagle

+0

Это имеет смысл, однако после изменения кода (для (int i = 0; i <= variable1.Length; i ++) ) он по-прежнему учитывает только первый элемент – user1166981

8

i в вашем цикле foreach содержит фактическое значение элемента из массива на каждой итерации, а не индекс. В вашем примере кода ваш массив, вероятно, содержит только нули, поэтому вы получаете только первый элемент (вы всегда используете индекс 0). Следовательно, вы должны проверить i, а не variable1[i].

Если вы собираетесь проверить против различных целочисленных констант, выражение switch является более подходящим, КСТАТИ:

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

switch/case экономит вам некоторые письма; если вы когда-либо вытаскиваете свои значения из любого места, кроме i, вы можете просто изменить часть (i) в инструкции switch, и более того, switch может быть оценен компилятором более эффективно, чем прикованные if - else.

Примечание: Вы не сможете непосредственно изменять значения массива в цикле foreach, так как вы не можете присвоить ничего i. Если вам нужно присвоить новые значения массива, вам придется

  • считать себя с дополнительной переменной, при этом используя foreach или
  • использовать еще один цикл такой, как for и получить товар на текущий индекс самостоятельно.
2

Написать, как это вместо:

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

i вы неправдоподобным не является индексом, но значение. Поэтому проверьте i с 1 или 2.

Если вы использовали цикл, то ваш внутренний код работал бы отлично.

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

Попробуйте использовать чехол для ключа. Гораздо быстрее, чем обычное if-else.

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