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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 .net_交流 于 2014-7-29 18:37 编辑

for 和 foreach 哪个效率高?用法有什么区别?foreach内部底层怎么写的?

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 许庭洲 于 2014-7-29 16:54 编辑

1.foreach语句是在C#中新引入的,它表示收集一个集合中的各元素,并针对各个元素执行内嵌语句;
2.foreach语句格式:foreach(type identifier in expression) embedded-statement
3.其中类型(type )和标示符(identifier )用来声明循环变量,表达式(expression)对应集合。
4.每执行一次内嵌语句,循环变量就依次取集合中的一个元素代入其中。
5.for语句是C#中使用频率最高的循环语句。在事先知道循环次数的情况下,使用for语句是比较方便的。
6.for语句的格式为:for(initializer;condition;iterator) embedded-statement
7.其中,initializer,condition,iterator这三项都是可选项,initializer为循环控制变量做初始化,循环控制变量可以有一个或多个(用逗号隔开);condition为循环控制条件,也可以有一个或多个语句;iterator按规律改变循环控制变量的值。
8.如果可以用for遍历的,一般来说for语句效率高,用foreach的对象需要实现枚举接口,for就不用了。:
9. for 可以代替 foreach,但效率上讲后者高些,特别是集合对象。

评分

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

查看全部评分

回复 使用道具 举报
当有人给你回复后,请及时把帖子编辑为提问结束,这样版主才给你加分。
回复 使用道具 举报
许庭洲 发表于 2014-7-29 16:43
1.foreach语句是在C#中新引入的,它表示收集一个集合中的各元素,并针对各个元素执行内嵌语句;
2.foreach ...

8.如果可以用for遍历的,一般来说for语句效率高,用foreach的对象需要实现枚举接口,for就不用了。:
9. for 可以代替 foreach,但效率上讲后者高些,特别是集合对象。

最后这两句到底哪个效率高
回复 使用道具 举报
看完后觉得有点矛盾
回复 使用道具 举报
键值对集合的遍历,for循环用不了了,只能使用foreach遍历
回复 使用道具 举报
本帖最后由 马振伟 于 2014-7-30 13:12 编辑

这个最好自己测测就会知道的,用一个大数据的集合或者数组什么的,一个for一个foreach。可以发现for比foreach要快的,foreach遍历的时候,采用的是移动指针(MoveNext),一次移动的一个长度(相对于被遍历的对象长度来说),就这一点,速度是很快的,C#本身没法随便使用指针,for循环是每次根据当前索引相对于0索引的偏移去计算地址的偏移,然后根据首地址来计算实际的地址,单纯这样看,for循环肯定慢。但是foreach并不是直接遍历的源集合,而是将源集合的每个值拷贝到栈上(对于引用类型,拷贝的是对象的地址),我们在遍历的是这个拷贝(这就是为什么不能再foreach中更改源集合的理由,因为你拿到的已经不是源集合了),这个拷贝的时间导致foreach在速度上一般会输给普通的for循环

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报 1 0
for与 foreach作用域不同,foreach作用于数组内部循环遍历的
回复 使用道具 举报
路过学习了!
回复 使用道具 举报
本帖最后由 FrancisTan 于 2014-8-5 11:28 编辑

纯讲效率的话,应该是for高,因为它是直接通过下标访问数组中的元素,而foreach在访问时会有一个对中间变量赋值的操作。foreach是通过指针偏移实现的,在最开始时,指针处于数组的-1位置(逻辑位置,实际就是在数组第一个元素前面),
很循环一次,指针就偏移一个单位,并将当前所指的元素赋值给中间变量,直到数组末尾。
所我用foreach是不能直接访问数组中的元素的,而且顺序永远都是一个挨着一个,不能改变。
而for循环则没有这些限制!个人喜欢在对数组只进行单纯的遍历,而不对数组元素进行操作的时候用foreach,比较方便!

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
foreach背后的原理                      1.自己写的类要被foreach 遍历就是要实现IEnumerable这个接口。          forrach背后的代码:          IEnumerator tor= lis.GetEnumerator();          while(tor.MoveNext())          {                  Console.Write(tor.Current);          }          2 GetEnumerator();这个方法 返回一个实现了IEnumerator接口对象          3.所以我们要实现IEnumerable这个接口中GetEnumerator()的话,就要写一个类来实现IEnumerator接口          并在GetEnumerator();方法中返回这个类的实例。          4.IEnumerator接口中定义一个Current只读属性 MoveNext方法  Reset()方法          5.MoveNext方法的作用 将指针向前移动一位 并判断当前位是否有元素 如果有返回true 没有就返回false          6.Current只读属性 得到当前指针指向的值          7.这两个方法都是在操作数组 而这个数组在我们的集合类中,所以我们要想办法将集合类中的数组传递到迭代器当前类中          8 迭代器对象在集合类中创建 所以可以通过构造函数让集合将他的数组传递给 迭代器,这个时候迭代器对象中应经有了数组的引用          9 实现MoveNext方法 声明index 变量 用来保存当前指针指向的数组的索引  默认-1          每调用一个这个方法 指针就向前移动一位 所以index++          判断数组[index]这个元素是否存在 index<count就存在          所以迭代器对象还需要知道元素的有效个数 通过构造函数传入          10 实现Current 只读属性 直接返回指针指向的数据 return arr[index]

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
不同实现用不同的方法吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马