class BasicCoolection<T> : IEnumerable<T>
private List<T> data = new List<T>();
public void FillList(params T[] items)
foreach(var datum in items)
data.Add(datum);
IEnumerator<T> IEnumerable<T>.GetEnumerator()
foreach(var datum in data)
yield return datum;
IEnumerator IEnumerable.GetEnumerator()
throw new NotImplementedException();
注意GetEnumerator方法,它并不会返回IEnumerator<T>
,相反,它遍历data数组中的各项,并依次返回每一项.重点在于yield关键字的使用.yiled关键词每次迭代要返回的值。
可这样理解yield语句:yield本意是放弃或让路,后因为一些语义的变化,有了生成、生产的意思。而yield return关键字表达的意思是,暂时让出控制权,返回(生成的)值.它临时将方法暂停,将一个值传回调用者。当调用者需要下一个值时,GetEnumerator方法就从上次暂停的地方继续,生成下一个值。
GetEnumerator定义了一个迭代器,编译器利用这些代码实现IEnumerator<T>
接口,其中包含Current属性和MoveNext方法。
我们可以通过提供附加属性来实现IEnumerable接口,并用一个迭代器返回数据,实现按相反顺序输出。
…