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

4 回答 4

8

循环中的iin保存每次迭代中数组的实际元素值,而不是索引。foreach在您的特定代码示例中,您的数组可能只包含零,这就是为什么您只获取第一个元素(您总是使用 index 0)。因此,您应该检查i而不是variable1[i].

如果您要检查各种整数常量,switch则表达式更合适,顺便说一句:

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

switch/case为你节省一些写作;如果您曾经从除 from 之外的任何其他地方提取值i,则可以简单地更改语句(i)中的部分switch,而且switch编译器可能比链式if-else语句更有效地评估。

注意:您将无法直接更改foreach循环中的数组值,因为您无法将任何内容分配给i. 如果您需要分配新的数组值,则必须

  • foreach在仍然使用或的同时用一个额外的变量来计算自己
  • 使用另一个循环,例如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
}

另一种方法是使用for循环,它会为您提供索引 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
}
于 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 回答