2011-02-14 102 views
2

有没有办法从函数中获得收益回报数而不保留计数器变量?例如?收益率回报长度

IEnumerable<someobject> function 
    { 
     for loop 
      yield return something 

     int numberreturned = .... 
    } 

回答

10

这将打败yield return目的。

使用yield return意味着你要实现发电机(MSDN调用的迭代器块),即,计算每次返回对飞值的对象。根据定义,生成器可能是无限的,因此控制可能永远不会离开您的for循环。

流以同样的方式工作。要计算一个流的长度,你必须用尽它,你可能永远不会从这样做返回。毕竟,数据可能来自无限来源(例如/dev/zero)。

0

您可以使用扩展方法计数上了IEnumerable <>你的函数返回

function().Count() 
+2

这将对方法*返回*值起作用,但会强制评估*(可能永远不会终止)。 – 2011-02-15 01:34:31

0

你可以使用IEnumerable.Count扩展方法!

我认为yield return旨在让编译器隐式地使用它后面的语句构建一个基本的迭代器。

如果你想要一个更复杂的迭代器,那么你可以用更明确的方式实现它。

+1

这将对方法*返回*值起作用 - 但会*强制评估*(可能永远不会终止)。 – 2011-02-15 01:33:53

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 
} 

快乐编码。