理解yield关键字的简单方法是使用return时我们不需要额外的类来保存迭代的结果
收益返回关键字。一般当我们遍历集合并想要返回结果时,我们使用集合对象
保持结果。我们来看例子。
public static List Multiplication(int number, int times)
{
List<int> resultList = new List<int>();
int result = number;
for(int i=1;i<=times;i++)
{
result=number*i;
resultList.Add(result);
}
return resultList;
}
static void Main(string[] args)
{
foreach(int i in Multiplication(2,10))
{
Console.WriteLine(i);
}
Console.ReadKey();
}
在上面的例子中,我想返回 2 十次相乘的结果。所以我创建了一个方法乘法
它返回我乘以 2 十次,我将结果存储在列表中,当我的 main 方法调用
乘法方法,控制循环循环十次并将结果结果存储在列表中。这是没有
使用收益回报。假设如果我想使用 yield return 来做到这一点,它看起来像
public static IEnumerable Multiplication(int number, int times)
{
int result = number;
for(int i=1;i<=times;i++)
{
result=number*i;
yield return result;
}
}
static void Main(string[] args)
{
foreach(int i in Multiplication(2,10))
{
Console.WriteLine(i);
}
Console.ReadKey();
}
现在 Multiplication 方法略有变化,返回类型为 IEnumerable 并且没有其他列表可以容纳
结果是因为要使用 Yield 返回类型必须是 IEnumerable 或 IEnumerator 并且因为 Yield 提供有状态迭代
我们不需要额外的类来保存结果。所以在上面的例子中,当从 Main 调用 Multiplication 方法时
方法,它计算第一次迭代的结果并将结果返回给 main 方法并返回到循环和
计算第二次迭代的结果并将结果返回给 main 方法。这样 Yield 将结果返回给调用
在每次迭代中逐个方法。还有其他关键字中断与 Yield 结合使用导致迭代
停止。例如,在上面的示例中,如果我只想计算一半的乘法(10/2=5),那么
该方法如下所示:
public static IEnumerable Multiplication(int number, int times)
{
int result = number;
for(int i=1;i<=times;i++)
{
result=number*i;
yield return result;
if (i == times / 2)
yield break;
}
}
这个方法现在会产生 2、5 倍的乘法结果。希望这能帮助您理解 Yield 的概念。更多
信息请访问http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx