IEnumerator和IEnumerable
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IEnumerator和IEnumerable相关的知识,希望对你有一定的参考价值。
IEnumerable和IEnumerator两个接口的语法定义。其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。IEnumerator对象有什么呢?它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。那么让我们看看IEnumerator接口有定义了什么东西。看下图我们知道IEnumerator接口定义了一个Current属性,MoveNext和Reset两个方法,这是多么的简约。既然IEnumerator对象时一个访问器,那至少应该有一个Current属性,来获取当前集合中的项吧。
MoveNext方法只是将游标的内部位置向前移动(就是移到一下个元素而已),要想进行循环遍历,不向前移动一下怎么行呢?(转载)
public static void Main(string[] args) { List<string> Person = new List<string>(); Person.Add("zhang"); Person.Add("hehe"); var s = Person.Select(p => p); print(s); Console.WriteLine(s); Console.ReadKey(); } public static void print(IEnumerable<string> ie) { IEnumerator<string> s = ie.GetEnumerator(); while(s.MoveNext()) { Console.WriteLine(s.Current); } }
说到IEnumerable总是会和IEnumerator、foreach联系在一起。
C# 支持关键字foreach,允许我们遍历任何数组类型的内容:
//遍历数组的项 int[] myArrayOfInts = {10,20,30,40}; foreach(int i in my myArrayOfInts) { Console.WirteLine(i); }
虽然看上去只有数组才可以使用这个结构,其实任何支持GetEnumerator()方法的类型都可以通过foreach结构进行运算。
一个类型是否支持foreach遍历,必须满足下面条件:
方案1:让这个类实现IEnumerable接口
方案2:这个类有一个public的GetEnumerator的实例方法,并且返回类型中有public 的bool MoveNext()实例方法和public的Current实例属性。
以上是关于IEnumerator和IEnumerable的主要内容,如果未能解决你的问题,请参考以下文章