黑马程序员技术交流社区

标题: for和foreach的区别 [打印本页]

作者: 吴治澎    时间: 2012-5-25 22:42
标题: for和foreach的区别
for和foreach,有for 为何又出现foreach ?或者说,彼此不可取代的地方在哪儿?


作者: 班顶超    时间: 2012-5-26 00:03
foreach 就是逐个遍历
for则不一定会逐个遍历 如for(int i=0;i<arr.length;i+=2) 可以按你定的任意模式来循环
逐个遍历用foreach会显得简洁一些吧,只有for能代替foreach  反之不一定能被代替
作者: 张雪风    时间: 2012-5-26 01:38
for任何情况下都能用,不管数组还是集合,但是前提是得知道元素个数才能遍历
foreach就不需要了知道总共多少个了,而且用起来方便,不用来回从数组或集合中提取对象,多数用于集合里对象的遍历和操作
foreach是通过GetEnumerator获得一个IEnumerator对象,通过IEnumerator对象执行MoveNext()方法和获取Current属性进行遍历的。
作者: G_Xiaotao    时间: 2012-5-26 10:17
for循环 是很随意的 但是你必须知道循环的次数  但是foreach就不用知道 并且foreach检索的集合必须>1所以在有些情况下你觉得那个方便你就用哪个!
作者: 熊华明    时间: 2012-5-26 14:39
for 你先要给初值,末值和步长
foreach 不需要事先给定初值,末值和步长,他是自动遍历给定的集合体的所有值
作者: 吴治澎    时间: 2012-5-26 14:52
谢谢!!
作者: 蒋春    时间: 2012-5-29 22:35
for是循环有明确的次数,不能循环对象,foreach没有明确的循环次数可以用foreach,同时可以循环对象(引用类型)
作者: 黑马——兰雷明    时间: 2012-5-31 23:22
补充一点:foreach遍历时,不能改变数组中的元素的值!
作者: 王针    时间: 2012-6-1 12:51
看了这帖子我才知道原来foreach比for的效率高那么多...
http://bbs.itheima.com/forum.php?mod=viewthread&tid=15638
作者: 吴治澎    时间: 2012-6-1 15:39
王针 发表于 2012-6-1 12:51
看了这帖子我才知道原来foreach比for的效率高那么多...
http://bbs.itheima.com/forum.php?mod=viewthread& ...

那贴子是我后来发的。{:3_47:}
作者: 王针    时间: 2012-6-1 15:45
吴治澎 发表于 2012-6-1 15:39
那贴子是我后来发的。

汗,原来就是本人,疏忽了。
我想你的理解已经很深了啊。:L
作者: 吴治澎    时间: 2012-6-1 15:47
王针 发表于 2012-6-1 15:45
汗,原来就是本人,疏忽了。
我想你的理解已经很深了啊。

:handshake:handshake:handshake
作者: 王国文    时间: 2012-6-3 21:12

在很多情况下for和foreach具有同样的功能,选择for还是foreach很多人可能都是看自己的喜好,本测试试图通过来真是测试数据来比较他们的执行效率。希望能给大家对他们的时候带来一些帮助。

测试环境:     
        硬件环境:       PIII800   +   CPU456
        软件环境:       VisualStudio.Net     +   C#

测试用例:
        利用结果集来存放记录,初始化对结果集添加记录
        分别对记录数为10000,100000,1000000条记录的时候进行采样分析

        关键测试对比代码如下,功能完全一样:
        //foreach开始时间
      datetime3   =   System.DateTime.Now.TimeOfDay.ToString();
      foreach(DataRow   row   in   relationData.Tables[RelationData.RELATIONINFO_TABLE].Rows)
  buffer   =   row[RelationData.PK_TABLE_NAME].ToString();
      datetime4   =   System.DateTime.Now.TimeOfDay.ToString();

      //for开始时间
      datetime5   =   System.DateTime.Now.TimeOfDay.ToString();
      for(int   j=0;j <1000000;j++)
                  buffer   =   relationData.Tables[RelationData.RELATIONINFO_TABLE].Rows[j][RelationData.PK_TABLE_NAME].ToString();
      datetime6   =   System.DateTime.Now.TimeOfDay.ToString();
  
测试结果:
      10000条记录时:
                  foreach读取时间:16:29:34.2577584   
                  foreach结束时间:16:29:34.2677728   
                  for读取开始时间:16:29:34.2677728   
                  for读取结束时间:16:29:34.2878016
      100000条记录时:
                  foreach读取时间:16:31:10.1055808   
                  foreach结束时间:16:31:10.1957104   
                  for读取开始时间:16:31:10.1957104   
                  for读取结束时间:16:31:10.4460704
      1000000条记录时:
                  foreach读取时间:16:33:12.6217504   
                  foreach结束时间:16:33:13.6332048   
                  for读取开始时间:16:33:13.6332048   
                  for读取结束时间:16:33:18.7906208

结果分析:
      1)对于10000条记录可以看出
                  foreach用了   0.0100144     
                  for循环用了0.0300432   
                  foreach所花的时间正好是for循环的   1/3   
      2)对于100000条记录可以看出
                  foreach用了0.0901296      
                  for循环用了0.2503600
                  foreach所花的时间是for循环的   36%
      3)对于1000000条记录结果可以看出
                  foreach用了1.0114544      
                  for循环用了4.1574160
                  foreach所花的时间是for循环的   25%

        通过对这些测试结果的分析,可以看出相对于原来的for语句foreach具有
更好的执行效率,foreach的平均花费时间只有for30%。通过测试结果在for和foreach都可以使用的情况下,我们推荐使用效率更高的foreach.在测试同时
我们附加的发现,用for写入数据时间大约是读取数据时间的10倍左右.:(引用)
作者: 王国文    时间: 2012-6-3 21:13

在很多情况下for和foreach具有同样的功能,选择for还是foreach很多人可能都是看自己的喜好,本测试试图通过来真是测试数据来比较他们的执行效率。希望能给大家对他们的时候带来一些帮助。

测试环境:     
        硬件环境:       PIII800   +   CPU456
        软件环境:       VisualStudio.Net     +   C#

测试用例:
        利用结果集来存放记录,初始化对结果集添加记录
        分别对记录数为10000,100000,1000000条记录的时候进行采样分析

        关键测试对比代码如下,功能完全一样:
        //foreach开始时间
      datetime3   =   System.DateTime.Now.TimeOfDay.ToString();
      foreach(DataRow   row   in   relationData.Tables[RelationData.RELATIONINFO_TABLE].Rows)
  buffer   =   row[RelationData.PK_TABLE_NAME].ToString();
      datetime4   =   System.DateTime.Now.TimeOfDay.ToString();

      //for开始时间
      datetime5   =   System.DateTime.Now.TimeOfDay.ToString();
      for(int   j=0;j <1000000;j++)
                  buffer   =   relationData.Tables[RelationData.RELATIONINFO_TABLE].Rows[j][RelationData.PK_TABLE_NAME].ToString();
      datetime6   =   System.DateTime.Now.TimeOfDay.ToString();
  
测试结果:
      10000条记录时:
                  foreach读取时间:16:29:34.2577584   
                  foreach结束时间:16:29:34.2677728   
                  for读取开始时间:16:29:34.2677728   
                  for读取结束时间:16:29:34.2878016
      100000条记录时:
                  foreach读取时间:16:31:10.1055808   
                  foreach结束时间:16:31:10.1957104   
                  for读取开始时间:16:31:10.1957104   
                  for读取结束时间:16:31:10.4460704
      1000000条记录时:
                  foreach读取时间:16:33:12.6217504   
                  foreach结束时间:16:33:13.6332048   
                  for读取开始时间:16:33:13.6332048   
                  for读取结束时间:16:33:18.7906208

结果分析:
      1)对于10000条记录可以看出
                  foreach用了   0.0100144     
                  for循环用了0.0300432   
                  foreach所花的时间正好是for循环的   1/3   
      2)对于100000条记录可以看出
                  foreach用了0.0901296      
                  for循环用了0.2503600
                  foreach所花的时间是for循环的   36%
      3)对于1000000条记录结果可以看出
                  foreach用了1.0114544      
                  for循环用了4.1574160
                  foreach所花的时间是for循环的   25%

        通过对这些测试结果的分析,可以看出相对于原来的for语句foreach具有
更好的执行效率,foreach的平均花费时间只有for30%。通过测试结果在for和foreach都可以使用的情况下,我们推荐使用效率更高的foreach.在测试同时
我们附加的发现,用for写入数据时间大约是读取数据时间的10倍左右.:(引用)
作者: 聂玉林    时间: 2012-6-4 10:06
foreach比for的执行效率要高,并且for可以不逐个遍历。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2