答案 0 :(得分:8)
我打算试着给你一个例子
这是经典的做法,它填充一个列表对象然后返回它:
private IEnumerable<int> GetNumbers()
{
var list = new List<int>();
for (var i = 0; i < 10; i++)
{
list.Add(i);
}
return list;
}
yield关键字逐个返回项目,如下所示:
private IEnumerable<int> GetNumbers()
{
for (var i = 0; i < 10; i++)
{
yield return i;
}
}
所以想象一下调用GetNumbers函数的代码如下:
foreach (int number in GetNumbers())
{
if (number == 5)
{
//do something special...
break;
}
}
不使用yield,你必须从0-10生成整个列表然后返回,然后迭代直到找到数字5.
现在感谢yield关键字,您只会生成数字,直到找到您想要的数字并打开循环。
我不知道我是否足够清楚......
答案 1 :(得分:0)
我的问题是,我什么时候使用它?有什么例子我在那里除了使用收益率别无选择吗?为什么有人觉得C#需要另一个关键字?
您链接的文章提供了一个很好的例子,说明何时以及如何使用它。
我讨厌引用你自己也链接过的文章,但是它太长了,而你却没有读过它。
yield关键字向编译器发出信号,表明它出现的方法是迭代器块。编译器生成一个类来实现迭代器块中表示的行为。
public static System.Collections.IEnumerable Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
在上面的示例中,yield语句在迭代器块中使用。调用Power方法时,它返回一个包含数字幂的可枚举对象。请注意,Power方法的返回类型是System.Collections.IEnumerable,它是迭代器接口类型。
因此,编译器会根据方法执行过程中产生的内容自动生成IEnumerable接口。
这是一个简化的例子,为了完整起见:
public static System.Collections.IEnumerable CountToTen()
{
int counter = 0;
while (counter++ < 10)
{
yield return counter;
}
}
public static Main(string[]...)
{
foreach(var i in CountToTen())
{
Console.WriteLine(i);
}
}