【发布时间】:2011-02-14 23:44:44
【问题描述】:
有没有办法从函数中获取收益返回的数量无需保留计数器变量?例如?
IEnumerable<someobject> function
{
for loop
yield return something
int numberreturned = ....
}
【问题讨论】:
标签: c# yield-return
有没有办法从函数中获取收益返回的数量无需保留计数器变量?例如?
IEnumerable<someobject> function
{
for loop
yield return something
int numberreturned = ....
}
【问题讨论】:
标签: c# yield-return
这会破坏yield return 的目的。
使用yield return 意味着您想要实现一个生成器(MSDN 将其称为迭代器块),即计算它返回的每个值的对象动态。根据定义,生成器可能是无限的,因此控制可能永远不会离开您的 for 循环。
流的工作方式相同。要计算流的长度,您必须将其耗尽,并且您可能永远不会从这样做中返回。毕竟,数据可能来自无限来源(例如/dev/zero)。
【讨论】:
没有。如果没有计数器,这是不可能的 -- 无法从函数本身访问返回的流。 (如果可能的话,我想知道它会带来什么样的奇怪语义/怪癖?)
但是,即使问题不希望得到这样的响应,也可以使用计数器(如果有疑问)完全可以;-) 请记住,这种形式的构造在流中的下一个项目时调用的闭包周围是“神奇的” (iterator) 是必需的——即根据需要在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
}
编码愉快。
【讨论】:
您可以在函数返回的 IEnumerable 上使用扩展方法计数
function().Count()
【讨论】:
您可以使用IEnumerable.Count 扩展方法!
我认为yield return 旨在让编译器使用其后的语句隐式构建基本迭代器。
如果您想要一个更复杂的迭代器,那么您可以以更明确的方式实现它。
【讨论】: