我在MSDN中见过这种语法:yield break,但我不知道它是做什么的。有人知道吗?
当前回答
结束迭代器块(例如,表示IEnumerable中没有更多的元素)。
其他回答
结束迭代器块(例如,表示IEnumerable中没有更多的元素)。
yield break语句导致枚举停止。实际上,yield break完成了枚举,而不返回任何附加项。
考虑到迭代器方法实际上有两种停止迭代的方式。在一种情况下,方法的逻辑可以在返回所有项后自然退出方法。这里有一个例子:
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount)
{
for (var i = 0UL; i < maxCount; i++)
{
startAt = NextPrime(startAt);
yield return startAt;
}
Debug.WriteLine("All the primes were found.");
}
在上面的例子中,一旦找到maxCount质数,迭代器方法自然会停止执行。
yield break语句是迭代器停止枚举的另一种方式。这是一种提前跳出枚举的方法。这里是与上面相同的方法。这一次,该方法对该方法可以执行的时间有一个限制。
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount, int maxMinutes)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0UL; i < maxCount; i++)
{
startAt = NextPrime(startAt);
yield return startAt;
if (sw.Elapsed.TotalMinutes > maxMinutes)
yield break;
}
Debug.WriteLine("All the primes were found.");
}
注意yield break的调用。实际上,它提早退出枚举。
还要注意,yield break与普通break的工作方式不同。在上面的例子中,yield break退出方法而不调用Debug.WriteLine(..)。
yield关键字与return关键字一起使用,为枚举器对象提供一个值。Yield return指定返回的值。当到达yield return语句时,存储当前位置。下次调用迭代器时,从这个位置重新开始执行。
用一个例子来解释它的意思:
public IEnumerable<int> SampleNumbers() { Int counter = 0; 收益回报计数器; 计数器=计数器+ 2; 收益回报计数器; 计数器=计数器+ 3; 收益回报计数器; }
迭代时返回的值为:0,2,5。
值得注意的是,本例中的counter变量是一个局部变量。在第二次迭代返回值2之后,第三次迭代从之前的位置开始,同时保留名为counter的局部变量之前的值2。
告诉迭代器它已经到达终点。
举个例子:
public interface INode
{
IEnumerable<Node> GetChildren();
}
public class NodeWithTenChildren : INode
{
private Node[] m_children = new Node[10];
public IEnumerable<Node> GetChildren()
{
for( int n = 0; n < 10; ++n )
{
yield return m_children[ n ];
}
}
}
public class NodeWithNoChildren : INode
{
public IEnumerable<Node> GetChildren()
{
yield break;
}
}
收益率突破只是一种表示最后一次返回并且不返回任何值的方式
e.g
// returns 1,2,3,4,5
IEnumerable<int> CountToFive()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
yield return 5;
yield break;
yield return 6;
yield return 7;
yield return 8;
yield return 9;
}
推荐文章
- .NET中的Map和Reduce
- 我如何能使一个组合框不可编辑的。net ?
- .NET反射的成本有多高?
- 实体框架回滚并移除不良迁移
- 将流转换为字符串并返回
- 在c#中检查字符串是否只包含数字的最快方法
- IEquatable和重写Object.Equals()之间的区别是什么?
- 创建一个堆栈大小为默认值50倍的线程有什么危险?
- 转换JSON字符串到JSON对象c#
- 显示两个datetime值之间的小时差值
- 如何设置enum为空
- 选择Enum类型的默认值而无需更改值
- 我如何设置在一个组合框中选择的项目,以匹配我的字符串使用c# ?
- String与StringBuilder
- 如何在ASP中使用ILogger进行单元测试。网络核心