IEnumable和yield

Posted adspark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IEnumable和yield相关的知识,希望对你有一定的参考价值。

yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,还需要实现IEnumerator,

 

static void Main(string[] args)
{
foreach (var item in new Program().SayHappyNewYear())
{
Console.WriteLine(item);
}
MyList2 myList2 = new MyList2();
foreach (var item in myList2)
{
Console.WriteLine(item);
}

}

 

使用yield的写法

public IEnumerable<String> SayHappyNewYear()
{
yield return ""; // yield在这里充当隐式的IEnumerator接口
yield return "";
yield return "";
yield return "";
yield break; // 向迭代器发出结束迭代的信号
}

 

 

 

不使用yield,实现IEnumerable和IEnumerator的写法

class MyList2 : IEnumerable
{
public IEnumerator GetEnumerator()
{
IEnumerator tor = new MyEnumerator(0);
return tor;
}

public class MyEnumerator : IEnumerator
{
private int state;
private object current;
public MyEnumerator(int state)
{
this.state = state;
}

public object Current
{
get { return current; }
}

public bool MoveNext()
{
switch (state)
{
case 0:
current = "";
state = 1;
return true;
case 1:
current = "";
state = 2;
return true;
case 2:
current = "";
state = 3;
return true;
case 3:
current = "";
state = 4;
return true;
case 4:
return false;
default:
break;
}
return false;
}

public void Reset()
{
throw new NotImplementedException();
}
}
}

 

使用yield关键字后return 指定的对象后,当前位置会进行保存下来,下次调用的时候会从这个位置开始执行。 
说白了,C#编译器会在编译后生成一个密封的类,该类实现了IEnumerator接口,所以是语法糖。

以上是关于IEnumable和yield的主要内容,如果未能解决你的问题,请参考以下文章

IQuerable与IEnumable的区别

python生成器中yield和send分析

使用C# yield关键字来提高性能和可读性

学 Python 怎能不知 yield?

使用 Yield 和 Ruby 包装 HTML 标签

神奇的yield