我使用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
}
}
答案 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 :(得分: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;
}
}
尝试使用开关盒。如果不这么快,比平时快得多。