如果方法实现IEnumerableString接口

时间:2022-06-29 05:14:19

那一次的邂逅:

  第一次见到yield的时候,内心中充塞了各类声音,这是个啥子鬼扯扯的对象?C#有这个破玩意吗?这是一个关键字?抑制不住内心的疑惑,熟练的打开了宇宙第一IDE ------ VS2015.

  

如果方法实现IEnumerableString接口

  卧槽,还真有这个关键字..  看一下解释 "yield 关键字" ,可以,反面我多逼逼! 微软大佬不愧是微软大佬,就是这么高冷.

魂牵梦绕:

  面对大佬如此爱答不理的态度,蛊惑起了我纯挚内心的无限遐想,先从字面意思yield理解:产量,产出。难道这个是一个调集该当具有的属性? 找到我们的老伴侣List<T>:

  

  从yield的字面意思上入手,我们把存眷点放在IEnumerable接口上,微软给出的解释是:果然的枚举数,该枚举数撑持在非泛型调集长进行简单的迭代.

   在C#要对一个调集进行遍历有两种方法:

   1.For循环

   2.Foreach循环

   对付Foreach循环,我们要为这个调集界说一个迭代器才华使用微软大佬给我们供给的福利(Foreach).

端倪传情

   控制不住本身的情绪,事不宜迟,先成立一个Test<T>类来实现IEnumerable来试一试:

   

class Test<T> : IEnumerable { public IEnumerator GetEnumerator() { throw new NotImplementedException(); } }

从代码中可以看出,要实现IEnumerable接口,必需要实现GetEnumerator()要领, 并且返回的类型是IEnumerator, 所以此刻我们要先实现IEnumerator这个接口

class Test<T> : IEnumerable { public IEnumerator GetEnumerator() { throw new NotImplementedException(); } class TestEnumerator : IEnumerator { public object Current { get { throw new NotImplementedException(); } } public bool MoveNext() { throw new NotImplementedException(); } public void Reset() { throw new NotImplementedException(); } } }

实现了IEnumerator接口,必需要实现 Current属性,以及MoveNext() 和 Reset()要领。 并且使用了嵌套类TestEnumerator,为什么要使用嵌套类呢,客官莫急莫急,且听臣娓娓道来.

Current : 简单的说就是生存调集当前的值,并且只有get权限.

MoveNext():返回的是个bool类型的值,用来判断调集是否还有下一个元素。 如果调集还有元素则返回true,反之亦然。

Rest():对调集进行重置操纵.

为什么要使用嵌套类呢?  因为我们要对Test<T>类的实例进行操纵,如果我们使用了一个*类,那么会得不到相应的数据(没有权限检察).

添加实现得到的代码如下:

class Test<T> : IEnumerable { private T[] values; //用于接收通报的数组 public Test() { } public Test(T[] values) //结构函数初始化 { this.values = values; } public IEnumerator GetEnumerator() { return new TestEnumerator(this); // 因为需要得到Test 实列的values.(所以使用嵌套类 有权限能访谒到values的值) } class TestEnumerator : IEnumerator { private Test<T> parent; private int index;//界说索引 public TestEnumerator(Test<T> parent) { this.parent = parent; index = -1;// 在foreach的时候 会先去挪用 GetEnumerator()要领, 所以先给定一个index=-1 初始化。 } public object Current //得到当前调集的值 { get { if (index == -1 || index == parent.values.Length) { throw new InvalidOperationException(); } return this.parent.values[index]; } } public bool MoveNext() //是否还有残剩元素 { if (index != parent.values.Length) { index++; } return index < parent.values.Length; } public void Reset() { index = -1; // 初始化索引值; } } }

不才对照懒,对付Test<T>的内部values只用了数组来存,有时间 我会更新成用链表的数据布局来实现这个要领,但是这个不是今天的重点..

测试下代码: