【发布时间】:2012-11-05 15:28:01
【问题描述】:
考虑以下方法:
IEnumerable<DateTime> GetTimes(int count)
{
for (int i = 0; i < count; i++)
yield return DateTime.Now;
yield break;
}
现在,我想叫它:
var times = GetTimes(2);
Console.WriteLine("First element:" + times.Take(1).Single().ToString());
Console.WriteLine("Second element:" + times.Skip(1).Take(1).Single().ToString());
Console.WriteLine("Third element:" + times.Skip(2).Take(1).Single().ToString());
Console.WriteLine("Finished...");
但最后一行代码永远不会运行。为什么?
【问题讨论】:
-
@Tigran:感谢您的评论。我添加了这一行来指示变量时间是什么。
-
@Alireza 实际上,如果你执行
GetTimes(2).Skip(2).Take(1),yield break;就会被调用。我想你的意思是在最后一个场景中写GetTimes(3) -
pastebin.com/SKFRzCp3 这是同样的事情,你希望它进入捕获,但它永远不会。因为迭代器永远不会被调用..非常巧妙的技巧..产量总是扭曲我的梅隆:p