A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴治澎 中级黑马   /  2012-5-25 22:42  /  3336 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

for和foreach,有for 为何又出现foreach ?或者说,彼此不可取代的地方在哪儿?

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

14 个回复

倒序浏览
foreach 就是逐个遍历
for则不一定会逐个遍历 如for(int i=0;i<arr.length;i+=2) 可以按你定的任意模式来循环
逐个遍历用foreach会显得简洁一些吧,只有for能代替foreach  反之不一定能被代替

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
for任何情况下都能用,不管数组还是集合,但是前提是得知道元素个数才能遍历
foreach就不需要了知道总共多少个了,而且用起来方便,不用来回从数组或集合中提取对象,多数用于集合里对象的遍历和操作
foreach是通过GetEnumerator获得一个IEnumerator对象,通过IEnumerator对象执行MoveNext()方法和获取Current属性进行遍历的。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
for循环 是很随意的 但是你必须知道循环的次数  但是foreach就不用知道 并且foreach检索的集合必须>1所以在有些情况下你觉得那个方便你就用哪个!

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
for 你先要给初值,末值和步长
foreach 不需要事先给定初值,末值和步长,他是自动遍历给定的集合体的所有值

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
谢谢!!
回复 使用道具 举报
蒋春 中级黑马 2012-5-29 22:35:43
7#
for是循环有明确的次数,不能循环对象,foreach没有明确的循环次数可以用foreach,同时可以循环对象(引用类型)

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
补充一点:foreach遍历时,不能改变数组中的元素的值!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
看了这帖子我才知道原来foreach比for的效率高那么多...
http://bbs.itheima.com/forum.php?mod=viewthread&tid=15638
回复 使用道具 举报
王针 发表于 2012-6-1 12:51
看了这帖子我才知道原来foreach比for的效率高那么多...
http://bbs.itheima.com/forum.php?mod=viewthread& ...

那贴子是我后来发的。{:3_47:}
回复 使用道具 举报
吴治澎 发表于 2012-6-1 15:39
那贴子是我后来发的。

汗,原来就是本人,疏忽了。
我想你的理解已经很深了啊。:L
回复 使用道具 举报
王针 发表于 2012-6-1 15:45
汗,原来就是本人,疏忽了。
我想你的理解已经很深了啊。

:handshake:handshake:handshake
回复 使用道具 举报

在很多情况下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倍左右.:(引用)
回复 使用道具 举报

在很多情况下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倍左右.:(引用)
回复 使用道具 举报
foreach比for的执行效率要高,并且for可以不逐个遍历。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马