有没有办法从函数中获得收益回报数而不保留计数器变量?例如?收益率回报长度
IEnumerable<someobject> function
{
for loop
yield return something
int numberreturned = ....
}
有没有办法从函数中获得收益回报数而不保留计数器变量?例如?收益率回报长度
IEnumerable<someobject> function
{
for loop
yield return something
int numberreturned = ....
}
这将打败yield return
目的。
使用yield return
意味着你要实现发电机(MSDN调用的迭代器块),即,计算每次返回对飞值的对象。根据定义,生成器可能是无限的,因此控制可能永远不会离开您的for
循环。
流以同样的方式工作。要计算一个流的长度,你必须用尽它,你可能永远不会从这样做返回。毕竟,数据可能来自无限来源(例如/dev/zero)。
您可以使用扩展方法计数上了IEnumerable <>你的函数返回
function().Count()
你可以使用IEnumerable.Count
扩展方法!
我认为yield return
旨在让编译器隐式地使用它后面的语句构建一个基本的迭代器。
如果你想要一个更复杂的迭代器,那么你可以用更明确的方式实现它。
这将对方法*返回*值起作用 - 但会*强制评估*(可能永远不会终止)。 – 2011-02-15 01:33:53
号这也不是没有可能的反 - 没有办法从函数本身内访问返回的流。 (如果可能的话,我想知道它会带来什么样的奇怪的语义/怪癖?)
但是,即使问题不需要这样的响应,这与计数器是完全可以的(如果可疑的话); - )请记住,当需要流(迭代器)中的下一项时调用闭包的这种构造形式是“魔术” - 也就是说,根据需要,流量控制离开和重新输入在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
}
快乐编码。
这将对方法*返回*值起作用,但会强制评估*(可能永远不会终止)。 – 2011-02-15 01:34:31