遍历的时候用for好还是用foreach好?

weilei0 2010-10-30 02:27:03
遍历的时候用for好还是用foreach好?
我知道两个都能遍历,并且觉得foreach比较严谨一点,但是我想知道一个全面的解释,谢谢
...全文
743 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
mohugomohu 2010-11-01
  • 打赏
  • 举报
回复
foreach在泛型遍历的时候更快
xqqkl 2010-11-01
  • 打赏
  • 举报
回复
使用foreach是注意隐含的修改容器类容的情况。
请看这样一段代码
public void CloseAllPages()
{
PageForm[] pageA = _visiblePageList.ToArray();
for(int i = 0; i < pageA.Length; i++)
{
pageA[i].Close();
}
}
_visiblePageList是一个浏览器页面窗口链表。在这里就不能使用foreach。
在页面文件关闭时会将自身从页面窗口链表中移除。这里就存在隐含修改容器内容的情况。

事件驱动中有很多隐含的情形,如何理解并对事件加以合理利用将会大大提高效率。如果不习惯事件驱动,这些隐含操作将会带来巨大的麻烦。
xiailiang 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gac520 的回复:]
看什么情况,但是大多数的时候还是喜欢用forEACH
[/Quote]

+1
xqqkl 2010-10-31
  • 打赏
  • 举报
回复
楼主帖子该结了。
楼层以高关键性回答就容易被淹,看24楼就可以了。
「已注销」 2010-10-31
  • 打赏
  • 举报
回复
用foreach好,效率高!
Teng_s2000 2010-10-31
  • 打赏
  • 举报
回复
微软保留for和foreach肯定是有道理的啊不是性能不性能问题

而是应用不同的场合,如果真的单纯性能不同其他地方都一样的话,肯定就会删除某一个了
happy664618843 2010-10-31
  • 打赏
  • 举报
回复
xqqkl 2010-10-31
  • 打赏
  • 举报
回复
至于所谓的用时间来测试性能纯属无稽之谈,这是在我大三之前对操作系统没有完全理解时使用的方式。性能不光是时间,但通常表现为时间。这程序执行内部记录一个执行时间是不对的。这个时间根本就不对,更谈不上不准确。
xqqkl 2010-10-31
  • 打赏
  • 举报
回复
最关键的是三楼,6楼也很正确。
foreach是只读的,如果在foreach中修改正在遍历的容器会抛出InvildOperation异常。
这这句话对系统提供的容器有效。如果自定义的容器中实现了相应的机制也有效。可以用Reflector查看一下系统提供的一些容器像List、Dictionary,会发现其中有个成员_version,每一次对容器的修改都会让_version值增加,在容器的遍历器中会检查_version的值如果值发生改变就会抛出异常。这应该是为了多线程考虑,当然也不全是,在遍历的实现中会保存容器的尺寸、当前访问的位置等信息以对下一次访问进行合理性检查。如果对容器进行修改这些信息就会过时,对下一次访问的合理性检查就有可能失效。会带来意想不到的结果。
foreach的实现用到了遍历器,遍历器需要消耗额外的空间与CPU的计算能力,如果有装箱和拆箱就更费事了。当然有人会说有yield。但是为了让循环的每次都执行对应yield语句是否需要额外的数据结构,这会带来比遍历器更多的空间消耗。

for语句没有这些额外的机制,循环控制由编码者完全控制,所以可以在循环内部对遍历对象进行修改,只要能够保证逻辑不出错。for语句的内部实现上来说不会需要额外的空间和计算能力。这并不能说for语句比foreach更有效。需要根据情况来定。对于数组或者其它连续存储的数据结构,在循环内部使用索引器进行访问,一般会使用偏移进行定位,这确实比较高效。但是对于非连续存储的数据结构,由于使用索引器进行定位不是靠偏移,有额外的计算工作。当然也有人在for里边使用遍历器进行访问,这还不如使用foreach。

所以能用foreach就用foreach,必须用for的时候才能用for。foreach简单易用性能损失可以忽略,如果为了提高性能,可以对算法进行优化,不用在这上面打主意。如果您已经到了不能忍受CLR带来的性能损失时请拒绝CLR。
wing7742 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyq11 的回复:]
foreach只读,for可写的.
foreach用于遍历实现IEnumerable接口的集合的元素
简洁
[/Quote]
+1
cjlefforts 2010-10-31
  • 打赏
  • 举报
回复
看情况。foreach遍历比较好点。
PitTroll 2010-10-30
  • 打赏
  • 举报
回复
要是for更快的话,那微软还要foreach干嘛呢,foreach(string str in strs) //strs是string[]类型的。
这样的foreach效率比for低?
那for(int i=0;i<3;i++)与int i=0;for(;i<3;i++)那个效率更高呢。
sdr[0]与sdr["a"]呢?
有得必有失,关键是你怎么衡量得失。牺牲时间换空间,牺牲空间换时间,牺牲空间时间换代码可读性等等。
兔子-顾问 2010-10-30
  • 打赏
  • 举报
回复
er...
有装箱拆箱么?不是说.net 1.x的时候会在foreach中对值类型装箱拆箱,.net 2.0(vs2005)的时候这个foreach的效率就不比for差了,因为有了yield关键字。
pxh360395296 2010-10-30
  • 打赏
  • 举报
回复
我要说的,SP哥帮我说了.
dalmeeme 2010-10-30
  • 打赏
  • 举报
回复
测试一下就知道了,基本上是一样的。
using System.Diagnostics;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string s = new string('中', 50000);
string r = "";
Stopwatch watch = new Stopwatch();
watch.Start();
foreach (char c in s)
r += c;
//for (int i = 0; i < 50000; i++)
// r += s[i];
watch.Stop();
div1.InnerText = watch.ElapsedMilliseconds.ToString() + "毫秒";
}
}
phil999 2010-10-30
  • 打赏
  • 举报
回复
for 仅仅是循环一定次数
foreach 是与 ienumerable 一起用的,至少有两个负担:

1,即使循环体是空的,也涉及对 ienumerator 成员的调用
2,有时候存在隐式的类型转换

foreach(object o in numbers) // numbers 是 int[]
每个元素都要装箱

foreach(int n in objects) // objects 是 object[]
每个元素都要拆箱

不过我们现在有了 ienumerable<t>,情况好很多。

所以我觉得是for更快。但是我没做测试,全是猜
你我他 2010-10-30
  • 打赏
  • 举报
回复
我都是论情况,但是很少用foreach , 应该没有多大的 区别,都是遍历。。
kokorenfeng 2010-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]
foreach是使用object类型“装箱拆箱”的,因此如果一定要说性能,那么显然完全可以说比for的性能低100倍。

但是这所谓100倍放到一个项目中却连慢一秒钟也看不出来,它被其它各种因素给稀释掉了。所以看是可以按照清晰性、简洁等等指标去选择。
[/Quote]
支持!!!
winner2050 2010-10-30
  • 打赏
  • 举报
回复
有时候需要知道循环到第几层,循环了几次,foreach 就没有那么好用了。

对象在循环的时候变化,foreach是不能实现的。

这个时候for 就发挥作用了。
weilei0 2010-10-30
  • 打赏
  • 举报
回复
那从运行时间上说是不是foreach更快一些呢?
加载更多回复(9)

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧