了解传统迭代和增强迭代在C#和Java上的实现

了解传统迭代和增强迭代在C#和Java上的实现,c#,java,compiler-construction,C#,Java,Compiler Construction,我对C#的foreach和Java在工作中的增强方式感到非常困惑,更令人沮丧的是,我意识到为什么我以前没有遇到过这个细节 但不管怎么说,事实是,我真的很想理解为什么这种显然相似的流控制语句的工作方式如此不同。为了便于说明,我们假设需要迭代一个整数数组,两种实现类似于: C#4.0(代码) JavaSE6(代码) 如果将该值用作索引器,foreach将为您提供数组中的每个值,而不是每个索引 如果你写信 foreach (var i in foobar) { Console.W

我对C#
foreach
Java在工作中的增强方式感到非常困惑,更令人沮丧的是,我意识到为什么我以前没有遇到过这个细节

但不管怎么说,事实是,我真的很想理解为什么这种显然相似的流控制语句的工作方式如此不同。为了便于说明,我们假设需要迭代一个整数数组,两种实现类似于:

C#4.0(代码)

JavaSE6(代码)


如果将该值用作索引器,foreach将为您提供数组中的每个值,而不是每个索引

如果你写信

   foreach (var i in foobar) {
        Console.Write(String.Format("{0} ", i));
    }
在C版本中应该是正确的

foreach (var i in foobar)
{
    Console.Write(String.Format("{0} ", foobar[i]));
}
…应该是

foreach (var i in foobar)
{
    Console.Write(String.Format("{0} ", i));
}
在整数数组上执行
foreach
,不会迭代数组索引:而是迭代整数

给定数组

int[] foobar = new int[] {0, 1, 1, 2, 3, 5, 8, 13, 21};
…您的代码是:

Printing element 0: 0
Printing element 1: 1
Printing element 1: 1
Printing element 2: 1
Printing element 3: 2
Printing element 5: 5
Printing element 8: 21
Printing element 13: IndexOutOfRangeException !!

我不确定是否应该将此作为注释添加到Carson63000或作为答案添加,但Java也有同样的问题

对于(inti:foobar)
{
系统输出打印(i);
}

作为旁注,我发现Java的“增强版for”不如C#的foreach直观。我认为在您处理Java之后,您开始理解“for(inti:foobar)”的含义,但我不认为有人会认为foreach更简单


不过,在使用for循环时,有时foreach和“enhanced for”并不是最佳选择。如果需要访问数组中的多个值,最好使用传统的for循环,因为foreach/enhanced for一次只允许访问一个值

我认为在主StackOverflow站点上这样做会更好。与其说是“算法和数据结构概念”,不如说是在C#和Java中使用特定的语言特性;另外,我想你不必在那里等18分钟就可以得到答案。:-)@Carson63000:谢谢你的评论。我会考虑像你这样有声望的人的任何建议,我很乐意将问题转移到StackOverflow,但考虑到人们开始在这里回答我,我认为现在这样做并不尊重我。我花了很长时间才理解你的要求。我会问:“以你为例,它们在哪些方面工作不同?我看到的结果完全相同。”。不过,您可以通过阅读文档来了解这一点
foreach
在C#中是非常基本的,我不能代表Java说话。@Tom W:我很抱歉读到这一点——幸运的是,还有其他贡献者理解了这个问题。那么你评论的重点是什么?我不认为这是一个建设性的贡献。是的,对不起,我想加上“。虽然我不懂Java,但我相信这完全是同一个问题”,但我忘记了,一旦我完成了所有代码片段的格式化工作。:-)
foreach (var i in foobar)
{
    Console.Write(String.Format("{0} ", foobar[i]));
}
foreach (var i in foobar)
{
    Console.Write(String.Format("{0} ", i));
}
int[] foobar = new int[] {0, 1, 1, 2, 3, 5, 8, 13, 21};
Printing element 0: 0
Printing element 1: 1
Printing element 1: 1
Printing element 2: 1
Printing element 3: 2
Printing element 5: 5
Printing element 8: 21
Printing element 13: IndexOutOfRangeException !!