您可以yield通过传入一个或多个可以在函数中定义终止条件的值或元素来扩展现有方法的功能,方法是调用ayield break停止执行内部循环。
public static IEnumerable<int> CountUntilAny(int start, HashSet<int> earlyTerminationSet)
{
int curr = start;
while (true)
{
if (earlyTerminationSet.Contains(curr))
{
// 我们已经达到了最终价值之一
yield break;
}
yield return curr;
if (curr == Int32.MaxValue)
{
//如果我们一直走到最后,请不要溢出;停下来
yield break;
}
curr++;
}
}上述方法将从给定start位置进行迭代,直到earlyTerminationSet遇到内的一个值。
// 从起点进行迭代,直到遇到定义为
// 终止元素
var terminatingElements = new HashSet<int>{ 7, 9, 11 };
// 这将从1开始迭代,直到遇到一个终止元素(7)
foreach(var x in CountUntilAny(1,terminatingElements))
{
// 这将写出从1到7的结果(这将触发终止)
Console.WriteLine(x);
}输出:
1
2
3
4
5
6
.NET Fiddle上的实时演示