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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

黑马马锋

初级黑马

  • 黑马币:0

  • 帖子:7

  • 精华:0

© 黑马马锋 初级黑马   /  2013-1-26 10:58  /  1655 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

两者有什么区别吗?谁效率更高?foreach能替代for吗?

评分

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

查看全部评分

7 个回复

倒序浏览
本帖最后由 朱京辉 于 2013-1-26 11:06 编辑

循环语句是编程的基本语句,在C#中除了沿用C语言的循环语句外,还提供了foreach语句来实现循环。那么我要说的就是,在循环操作中尽量使用foreach语句来实现。

foreach语句很简洁,但是它的优点不仅仅在于此,它的效率也是最高的。可能很多人认为最后一种的效率会更高,因为表面上看着不用每次访问引用类型的属性。可是它却是三者当中,效率最低的。因为C#是强类型检查,那么对于数组访问的时候,要对索引的有效值进行判断.

(书中这里有些出入,经过网友sozdream的提示,在1.1环境下发现最后一种方法是最快的,前两者的速度基本相等;通过Dissambly查看最后一种循环方法所产生的代码,并没有产生类似于文章所说的那种索引检查。不过还是不建议使用最后一种,因为此方法对索引的判断有些脱节,尤其是当循环中数组尺寸发生变化的时候,索引有效检查无法及时进行)

foreach语句除了简洁和高效外,还有很多优点,接下来一一列举。

第一个就是不用考虑数组起始索引是几,很多人可能从其他语言转到C#的,那么原先语言的起始索引可能不是1,例如VB或者Delphi语言,那么在C#中使用数组的时候就难免疑问到底使用0开始还是用1开始呢,那么使用foreach就可以避免这类问题。

第二个好处就是对于多维数组操作用foreach就非常简便了.

对于三维或更多维,foreach语句不用发生任何变化,而对于for语句来说就要进行修改了,这里就不多说了。

第三个要说的就是foreach完成类型转换操作,这种体现可能通过如上的例子看不出任何效果,但是对于ArrayList之类的数据集来说,这种操作就显得比较突出

最后要说的是使用foreach并没有增加资源使用,这句话听得有些难懂,由于对于继承了IEnumerable接口的类型数据,才能使用foreach语句,那么对于使用foreach会访问IEnumerable接口中GetEnumerator方法来进行枚举,那么对于如上的foreach语句

也就是说在出了foreach之后对于IEnumerator的对象也进行Dispose处理。
对于foreach说了这么多好处,那么在使用它是否可以无懈可击呢。其实不是这样的,在foreach语句中有两个限制,第一不能修改枚举成员,其次不要对集合进行删除操作。

就是对于一个记录集的多条数据删除问题,也是经常出现问题的地方(论坛上经常问类似的问题),由于在一些记录集中进行删除的时候,在删除操作之后相应的索引也发生了变化,这时候的删除要反过来进行删除,大致形式如下。
// Use "for" to loop an arraylist
for( int i = arrInt.Count - 1; i >=0; i-- )
{
int n = ( int ) arrInt;
if( n == 5 )
arrInt.RemoveAt( i ); // Remove data here
Debug.WriteLine( n.ToString() );
}
除了这两个地方外,foreach可以基本适用于任何循环,因此对于循环的编写要尽量使用foreach,因为它会使你的代码清晰简洁,又不失高效。


详细参考http://bbs.itheima.com/thread-36444-1-2.html  帖子中写得很详细

评分

参与人数 1技术分 +1 黑马币 +10 收起 理由
张文 + 1 + 10 很给力!

查看全部评分

回复 使用道具 举报
forecach的主要作用是遍历,将数组或集合的所有元素都遍历一次
for具有foreach的遍历作用,而且for还可以指定循环遍历的次数,即for的功能大于foreach

评分

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

查看全部评分

回复 使用道具 举报
朱京辉 发表于 2013-1-26 11:02
循环语句是编程的基本语句,在C#中除了沿用C语言的循环语句外,还提供了foreach语句来实现循环。那么我要说 ...

原来已经有人解答了...我已经习惯了用for,看来得改改了...
回复 使用道具 举报
靳石磊 发表于 2013-1-26 11:02
forecach的主要作用是遍历,将数组或集合的所有元素都遍历一次
for具有foreach的遍历作用,而且for还可以指 ...

嗯,就是说两者同时存在是有原因的...
回复 使用道具 举报
mafeng19920328 发表于 2013-1-26 11:16
嗯,就是说两者同时存在是有原因的...

对,有些地方只能用for,那个帖子里有,foreach的循环体里不能对索引进行值修改
for(int i=0; i<100; i++)
{
    i += 3;  //这里关键,这个修改 i  的操作在foreach就无法进行
    console.write("as");
}
回复 使用道具 举报
至于谁快,我做了一个小实验
代码
            ArrayList list = new ArrayList();
            Stopwatch st = new Stopwatch();
            
            for (int i = 0; i < 100000; i++)
            {
                list.Add("aa");
            }
            st.Start();
            for (int i = 0; i < list.Count; i++)
            {
               
            }
            st.Stop();
            Console.WriteLine("for遍历list10万条记录用了{0}", st.Elapsed);
            st.Start();
            foreach (string item in list)
            {
               
            }
            st.Stop();
            Console.WriteLine("foreach遍历list10万条记录用了{0}", st.Elapsed);
            Console.ReadKey();

结果

其实老师也说过,说for快,因为foreach在程序内部也是执行的for   好像是这样的
回复 使用道具 举报
一看看个人爱好,二看具体运用。foreach我们使用的时候都叫遍历。区别还是有的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马