- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
初学C#的时候,老是被IEnumerable、IEnumerator、ICollection等这样的接口弄的糊里糊涂,我觉得有必要切底的弄清楚IEnumerable和IEnumerator的本质。
下面我们先看IEnumerable和IEnumerator两个接口的语法定义。其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。IEnumerator对象有什么呢?它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。那么让我们看看IEnumerator接口有定义了什么东西。看下图我们知道IEnumerator接口定义了一个Current属性,MoveNext和Reset两个方法,这是多么的简约。既然IEnumerator对象时一个访问器,那至少应该有一个Current属性,来获取当前集合中的项吧。
MoveNext方法只是将游标的内部位置向前移动(就是移到一下个元素而已),要想进行循环遍历,不向前移动一下怎么行呢?
详细讲解:
说到IEnumerable总是会和IEnumerator、foreach联系在一起。
C# 支持关键字foreach,允许我们遍历任何数组类型的内容:
//遍历数组的项
int[] myArrayOfInts = {10,20,30,40};
foreach(int i in my myArrayOfInts)
{
??? Console.WirteLine(i);
}
虽然看上去只有数组才可以使用这个结构,其实任何支持GetEnumerator()方法的类型都可以通过foreach结构进行运算。
[csharp]? HYPERLINK /byondocean/article/details/6871881 \o view plain view plain HYPERLINK /byondocean/article/details/6871881 \o copy copy
public?class?Garage??
{??
????Car[]?carArray?=?new?Car[4];??//在Garage中定义一个Car类型的数组carArray,其实carArray在这里的本质是一个数组字段??
??
????//启动时填充一些Car对象??
????public?Garage()??
????{??
????????//为数组字段赋值??
????????carArray[0]?=?new?Car(Rusty,?30);??
????????carArray[1]?=?new?Car(Clunker,?50);??
????????carArray[2]?=?new?Car(Zippy,?30);??
????????carArray[3]?=?new?Car(Fred,?45);??
????}??
}??
理想情况下,与数据值数组一样,使用foreach构造迭代Garage对象中的每一个子项比较方便:
[csharp]? HYPERLINK /byondocean/article/details/6871881 \o view plain view plain HYPERLINK /byondocean/article/details/6871881 \o copy copy
//这看起来好像是可行的??
lass?Program??
???{??
???????static?void?Main(string[]?args)??
???????{??
???????????Console.WriteLine(*********Fun?with?IEnumberable/IEnumerator************\n);??
???????????Garage?carLot?=?new?Garage();??
??
???????????//交出集合中的每一Car对象吗??
????????????foreach?(Car?c?in?carLot)??
???????????{??
???????????????Console.WriteLine({0}?is?going?{1}?MPH,?c.CarName,?c.CurrentSpeed);??
???????????}??
??
???????????Console.ReadLine();??
???????}??
???}??
让人沮丧的是,编译器通知我们Garage
文档评论(0)