loops - 为什么我应该在循环中使用 foreach 而不是 for (int i=0; i<length; i++) ?

标签 loops foreach language-agnostic

在 C# 和 Java 中循环似乎很酷的方式是使用 foreach 而不是 C 风格的 for 循环。

有什么理由让我更喜欢这种风格而不是 C 风格?

我对这两个案例特别感兴趣,但请尽可能多地解决您需要解释您的观点的案例。

  • 我希望对列表中的每个项目执行操作。
  • 我正在列表中搜索一个项目,并希望在找到该项目时退出。

最佳答案

假设您是一家餐厅的主厨,而你们都在为自助餐准备一个大煎蛋。你把一盒一打鸡蛋递给厨房的两个工作人员,然后告诉他们,字面上的意思是,他们要开裂了。

第一个设置一个碗,打开 crate ,依次捕获每个鸡蛋 - 从左到右穿过顶排,然后是底排 - 将鸡蛋靠在碗的侧面打破,然后将其倒入碗中.最终他的鸡蛋用完了。干得好。

第二个人端起一个碗,打开 crate ,然后冲出去拿了一张纸和一支笔。他在鸡蛋盒的隔间旁边写下数字 0 到 11,并在纸上写下数字 0。他看了看纸上的数字,找到标有 0 的隔间,取出鸡蛋并将其打入碗中。他又看了看纸上的 0,想着“0 + 1 = 1”,把 0 划掉,在纸上写下 1。他从隔间 1 中取出鸡蛋并将其敲碎。以此类推,直到数字 12 出现在纸上,他知道(不看!)没有更多的鸡蛋了。干得好。

你会觉得第二个家伙脑子有点乱,对吧?

使用高级语言的目的是避免必须用计算机术语来描述事物,并且能够用您自己的术语来描述它们。语言级别越高,这一点就越真实。在循环中递增计数器会分散您真正想做的事情:处理每个元素。


此外,链表类型的结构不能通过递增计数器和索引来有效处理:“索引”意味着从头开始重新计数。在 C 中,我们可以处理我们自己创建的链表,方法是使用循环“计数器”的指针并取消引用它。我们可以在现代 C++ 中使用“迭代器”(在一定程度上在 C# 和 Java 中)做到这一点,但这仍然存在间接性问题。


最后,一些语言已经足够高级了,实际上编写一个循环来“对列表中的每个项目执行操作”或“搜索列表中的项目”的想法是骇人听闻(就像主厨不应该告诉第一个厨房工作人员如何确保所有鸡蛋都裂开一样)。提供了设置该循环结构的函数,您可以通过高阶函数或比较值(在搜索情况下)告诉它们在循环中要做什么。 (事实上​​,你可以在 C++ 中做这些事情,虽然接口(interface)有些笨拙。)

关于loops - 为什么我应该在循环中使用 foreach 而不是 for (int i=0; i<length; i++) ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4383250/

相关文章:

Java - 迭代自定义字母表

c - 数组在c中如何工作?

PHP、MySQL、SELECT 问题

PHP 速记加法运算符 - undefined offset

sql - 填充槽的算法

Python:如何让用户输入自己的解决方案到答案键

Javascript/JQuery 遍历数组值

c# - 如何更改 foreach 迭代器引用的原始数据类型变量的值

algorithm - 是否有任何公式可以将 [0..πR²] 范围内的 int 映射到半径 R 的圆内的 (x,y) 坐标?

floating-point - float有负零吗? (-0f)