foreach可以遍历一些数据类型。由图可知,被遍历的数据类型必须拥有GetEnumerator的公共方法。
在使用foreach遍历时涉及到var推断类型,这时如何不是实现泛型版本,则一律是object类型。
foreach遍历只能读取数据,不能修改数据,可以通过string检测,string是可遍历的,但是组成它的char是不能改变的。(只在次情景下)。
foreach遍历只进,一条一条往下读,和操作数据库的DataReader的Read方法类似。
由上面的分析可知,需要在类的内部定义IEnumerator方法,才能被遍历。这里有两个办法解决。
方法一、通过yield
yield return 表达式;如果返回值为IEnumerable
如果返回值为IEnumerator
遍历时能以此拿到上图中person数组的值。
方法二 通过实现IEnumerable接口
IEunmerable包括GetEunmetator的方法,并且返回值是IEnumerator的类型。
此时就需要另外一个类去继承IEnumerator接口,这样才能返回它的子类,即可达到目的。
实现过程:
1.需要添加int类型的变量,用于标记索引的位置。这里用int position=-1。
2.添加对应的数组变量,用于接收传过来的数组。这里用string[] persion;
3.实现的Curren属性,需要返回当前索引的数据。return person[position];
4.实现MoveNext方法,需要将指针(索引)加1,向前移动,返回值是bool类型,用于确定是否操作了索引。
5.实现Reset方法,这是重置方法,把position赋值为-1;
6.添加一个带参数的构造函数,其中接收传递过来的数据。
三、List集合分析
通过反射工具可知,List集合的Add方法就是给内部的item添加值,而这个item是一个数组。因为是泛型的,所以显示为T。
也就是其中集合的内部有这样一个变量,用来存储添加进来的数据,也就像上面自己定义的数组一样,这样List集合类就和上述
自定义的类一致了,上述的定义只是为了演示过程,当然出于业务的需求,是可以自己去实现扩展上述类的,例如把静态的数据
改变为Add方法添加,筛选数据的逻辑等,都可以根据业务需求进行扩展。
以上是C#中foreach实例代码的详细内容。更多信息请关注PHP中文网其他相关文章!