5

整数の長いリストを保持するために int 配列を使用しています。この配列の各要素について、配列に格納されている各値について、1 であるかどうかを確認し、そうであれば 1 のみに関連する処理を行い、そうでない場合は 2 に関連する他の処理を行います。以下のコードを思いついたのですが、期待どおりに動作しません。何か不足していますか? 起こっていることは、配列の最初の値だけが考慮されているということです。

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

4 に答える 4

8

ループ内のは、インデックスではなく、各反復で配列からの実際の要素値を保持しますiforeach特定のコード サンプルでは、​​配列はおそらくゼロしか保持していないため、最初の要素のみを取得しています (常に index を使用しています0)。したがって、ではなくチェックする必要があります。ivariable1[i]

さまざまな整数定数をチェックする場合は、switch式の方が適しています。

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

switch/case書く手間を省きます。以外の場所から値を取得する場合は、ステートメントの一部をi変更するだけで済み、さらに、チェーンされた-ステートメントよりも効率的にコンパイラーによって評価される可能性があります。(i)switchswitchifelse

注:foreachには何も代入できないため、ループ内で配列の値を直接変更することはできませんi。新しい配列値を割り当てる必要がある場合は、

  • foreachorを使用しながら、追加の変数で自分を数える
  • などの別のループを使用forして、現在のインデックスにあるアイテムを自分で取得します。
于 2012-06-26T07:02:05.647 に答える
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ループを使用する方法があります。

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
}
于 2012-06-26T07:01:56.987 に答える
2

代わりに次のように書きます。

foreach (int i in variable1) {
    if (i == 1) {
    ....
于 2012-06-26T07:03:24.457 に答える
0

取得したのiはインデックスではなく値です。i1か2で確認してください。

for ループを使用していた場合、内部コードは完全に機能します。

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

スイッチケースを使ってみてください。通常の if-else よりもはるかに高速です。

于 2012-06-26T07:11:51.197 に答える