在使用 foreach中的foreach (string line in lines)时in所代表的含意,求解!!!! 作者: 张振 时间: 2013-4-14 11:50
foreach和for有相似用法
但foreach可能写法上更为简单,运行效率应该也高些
string line in lines 一个单词一个单词的说
首先 string 为数组的元素的类型
这个数组是 字符串数组
如果是Int数组 就用 int
line 这个是成员变量名 可以任意取名 其代表了数组lines 中的每个元素的统一名称
in 这个相当于关键字 只数组成员在数组中
in 指向字符串数组Lines 然后开始执行遍历 作者: 袁振龙 时间: 2013-4-14 12:03
运行的时候首先从lines中取出一行,然后去执行要执行的代码,然后再返回foreach取出一行,再执行要执行的代码……直到lines中的数据都取出执行一遍为
在foreach循环中,迭代集合collectionObject的过程如下:
(1)调用collectionObject.GetEnumerator(),返回一个IEnumerator引用。这个方法可以通过IEnumerable接口的实现代码来获得。但这是可选的。
(2)调用返回的IEnumerator接口的MoveNext()方法。
(3)如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性获取对象的一个引用,用于foreach循环。
(4)重复前面两步,直到MoveNext()方法返回false为止,此时循环停止。 作者: 石国庆 时间: 2013-4-14 13:31
能够进行foreach的类型结构,都必须实现IEnumerable接口。IEnumerable接口,有一个GetEnumerator的方法,返回一个实现IEnumerator接口的对象。IEnumerator接口,有Current只读属性,MoveNext方法,Reset方法。比如类型结构 TestForeach 一个对象tf ,在进行foreach的时候,比如如下:foreach(var a in tf){ console.writeLine(a.toString());}程序运行到var a in tf时,实际上,调用了TestForeach的GetEnumerator()方法,返回一个a,当运行完console.writeLine(a.toString());后,继续运行 var a in tf,其实是调用了 上一次的a.MoveNext()放法,直到a.MoveNext=false foreach运行完毕。作者: 曾玉锋 时间: 2013-4-14 16:28
纠正楼上一些同学的一点错误的说法。
foreach迭代遍历的效率不如for、while等循环结构,因为for、while等循环结构是直接通过索引对原数组元素进行访问,而foreach的工作原理是:先将数组或者集合copy一份到内存,然后通过MoveNext()移动游标进行判断数组或者集合中是否还有元素需要遍历,返回true,则调用Current属性,[(foreach (string str in lines))]得到下一个要遍历的对象 赋值给变量str;返回false,说明已经遍历结束。
与for、while等循环相比,foreach多了一个copy集合的过程。而且foreach迭代是通过游标来访问集合中的元素,它是依次逐个遍历,无法改变遍历的顺序。