收益率长度

时间:2011-02-14 23:44:45

标签: c# yield-return

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

  IEnumerable<someobject> function
  {
      for loop
          yield return something

      int numberreturned = ....
  }

4 个答案:

答案 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旨在让编译器使用其后面的语句隐式构建一个基本迭代器。

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