循环遍历数组问题的内容

时间:2012-06-26 06:59:39

标签: c#

我使用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 个答案:

答案 0 :(得分:8)

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

如果要检查各种整数常量,switch表达式更合适,BTW:

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
  • 时使用其他变量计算自己
  • 使用另一个循环,例如{{1}},并自行检索当前索引处的项目。

答案 1 :(得分: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
}

答案 2 :(得分:2)

这样写:

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

答案 3 :(得分:0)

您获取的i不是索引而是值。因此,请使用1或2检查i

如果您使用for循环,那么您的内部代码将完美运行。

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

尝试使用开关盒。如果不这么快,比平时快得多。