Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环遍历数组问题的内容_C# - Fatal编程技术网

C# 循环遍历数组问题的内容

C# 循环遍历数组问题的内容,c#,C#,我使用一个整数数组来保存一长串整数。对于这个数组的每个元素,我想检查它是否为1,如果是,则只做与1相关的事情,否则如果是2,则对数组中存储的每个值做其他与2相关的事情,依此类推。我想出了下面的代码,但它没有像预期的那样工作,有什么我遗漏的吗?发生的情况是,只考虑数组的第一个值 int[] variable1 = MyClass1.ArrayWorkings(); foreach (int i in variable1) { if (variable1[i] == 1) {

我使用一个整数数组来保存一长串整数。对于这个数组的每个元素,我想检查它是否为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
    }
}

你试图做一些毫无意义的事情。为了了解它是如何工作的,我们举一个简单的例子,一个值为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
}

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

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

foreach (int i in variable1) {
    switch (i) {
        case 1:
            // arbitrary stuff
            break;
        case 2:
            // arbitrary stuff
            break;
    }
}
开关
/
大小写
可以节省一些书写时间;如果您从
i
以外的任何地方提取值,只需更改
(i)
switch
语句中的一部分,而且,编译器对
switch
的计算效率可能高于链接的
if
-
else
语句

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

  • 在仍然使用
    foreach
使用另一个循环,如
,然后自己在当前索引中检索该项

    改为这样写:

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

    您获取的
    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;
        }
    }
    

    尝试使用switch case。如果没有,则比正常情况下快得多。

    这是有意义的,但是在更改代码(for(int i=0;i@user1166981只有当a.第一个条件始终为true,或b.如果数组{2,2,2,2,2,2,2,1}中有10个项,则使用break或return停止迭代,才会考虑第一个元素,您发布的最后一个代码示例应该计算每个元素,对吗?因此,如果我在每个if语句下都有逻辑,那么MyVariable=MyVariable+I;总数应该是19还是2?@user1166981似乎应该是19。一定有其他事情发生了;发布代码可能吗?好的,我应该更新我原来的帖子并在编辑框中显示原因吗?