黑马程序员技术交流社区

标题: foreach 的工作原理 [打印本页]

作者: 苟于伟    时间: 2013-4-14 11:42
标题: foreach 的工作原理
本帖最后由 苟于伟 于 2013-4-15 02:35 编辑
  1. private void btnResult_Click(object sender, EventArgs e)
  2.         {
  3.             string[] lines = txt成绩.Lines;
  4.             string maxName = "";
  5.             int maxScore = -1;
  6.             foreach (string line in lines)
  7.             {
  8.                 string[] strs = line.Split('=');
  9.                 string name = strs[0];
  10.                 string strScore = strs[1];
  11.                 int score = Convert.ToInt32(strScore);
  12.                 if (score > maxScore)
  13.                 {
  14.                     maxName = name;
  15.                     maxScore = score;
  16.                 }
  17.             }
  18.             MessageBox.Show(string.Format("{0}的成绩{1}分",maxName,maxScore));
  19.         }
复制代码
在使用 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迭代是通过游标来访问集合中的元素,它是依次逐个遍历,无法改变遍历的顺序。

能用for、while 等循环做的事情尽量用循环做,因为可以通过控制索引来操作访问的元素。
还有一点要注意的是,刚才已经提到了 foreach遍历的是copy原集合或者数组得到的新集合或者数组,所以,取出来的元素并不是原集合中的元素,对该元素的操作对原集合或者数组是没有任何影响的。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2