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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苟于伟 中级黑马   /  2013-4-14 11:42  /  2185 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 苟于伟 于 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所代表的含意,求解!!!!

评分

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

查看全部评分

4 个回复

倒序浏览
foreach和for有相似用法
但foreach可能写法上更为简单,运行效率应该也高些
string line in lines  一个单词一个单词的说
首先 string 为数组的元素的类型
这个数组是 字符串数组
如果是Int数组 就用 int
line 这个是成员变量名 可以任意取名 其代表了数组lines 中的每个元素的统一名称
in  这个相当于关键字  只数组成员在数组中
in 指向字符串数组Lines 然后开始执行遍历
回复 使用道具 举报
运行的时候首先从lines中取出一行,然后去执行要执行的代码,然后再返回foreach取出一行,再执行要执行的代码……直到lines中的数据都取出执行一遍为

在foreach循环中,迭代集合collectionObject的过程如下:
(1)调用collectionObject.GetEnumerator(),返回一个IEnumerator引用。这个方法可以通过IEnumerable接口的实现代码来获得。但这是可选的。
(2)调用返回的IEnumerator接口的MoveNext()方法。
(3)如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性获取对象的一个引用,用于foreach循环。
(4)重复前面两步,直到MoveNext()方法返回false为止,此时循环停止。

评分

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

查看全部评分

回复 使用道具 举报
能够进行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运行完毕。
回复 使用道具 举报
纠正楼上一些同学的一点错误的说法。
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原集合或者数组得到的新集合或者数组,所以,取出来的元素并不是原集合中的元素,对该元素的操作对原集合或者数组是没有任何影响的。

点评

嗯 懂了 受教了 一直以为foreach 写的简单 运行的也要简单  发表于 2013-4-14 16:52

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马