有没有办法从函数中获得收益率回报数而不保留计数器变量?例如?
IEnumerable<someobject> function
{
for loop
yield return something
int numberreturned = ....
}
答案 0 :(得分:10)
这会破坏yield return
的目的。
使用yield return
表示你想要实现一个生成器(MSDN调用迭代器块),即一个计算它动态返回的每个值的对象 >。根据定义,生成器可能是无限的,因此控制可能永远不会离开for
循环。
Streams的工作方式相同。要计算流的长度,你必须耗尽它,你可能永远不会从这样做回来。毕竟,数据可能来自无限来源(例如/dev/zero)。
答案 1 :(得分:2)
否。如果没有计数器,这是不可能的 - 无法从函数本身访问返回的流。 (如果有可能,我想知道它会带来什么样的奇怪语义/怪癖?)
然而,这对于一个计数器是完全没问题(如果有问题),即使问题不需要这样的响应;-)请记住,当流中的下一个项目时,这种形式的构造对于调用的闭包是“神奇的” (迭代器)是必需的 - 也就是说,流控制离开并且在yield return
处根据需要重新进入。
IEnumerable<someobject> Function
{
int counter = 0;
foreach (...) {
counter++;
yield return ...;
}
// after here we know count -- /assuming/ control gets here
// 1) value can't be 'normally returned'
// 2) and if the stream evaluation never exhausts the loop above
// then flow-control will never get here
}
快乐的编码。
答案 2 :(得分:0)
你可以在IEnumerable&lt;&gt;上使用扩展方法计数你的函数返回
function().Count()
答案 3 :(得分:0)
您可以使用IEnumerable.Count
扩展方法!
我认为yield return
旨在让编译器使用其后面的语句隐式构建一个基本迭代器。
如果你想要一个更复杂的迭代器,那么你可以以更明确的方式实现它。