收益率长度

有没有办法在不保留计数器变量的情况下从函数中获得收益率返回数?例如?
  IEnumerable<someobject> function
  {
      for loop
          yield return something

      int numberreturned = ....
  }
    
已邀请:
那会破坏
yield return
的目的。 使用
yield return
意味着你想要实现一个生成器(MSDN调用迭代器块),即一个计算它在运行中返回的每个值的对象。根据定义,生成器可能是无限的,因此控制可能永远不会离开你的
for
循环。 流以相同的方式工作。要计算流的长度,你必须耗尽它,你可能永远不会从这样做回来。毕竟,数据可能来自无限来源(例如/ dev / zero)。     
没有。如果没有计数器,这是不可能的 - 无法从函数本身访问返回的流。 (如果有可能,我想知道它会带来什么样的奇怪语义/怪癖?) 但是,这对于计数器是完全没问题(如果有问题),即使问题不需要这样的响应;-)请记住,当流中的下一个项目(迭代器)时,这种形式的构造对于调用的闭包是“神奇的”是必需的 - 也就是说,流量控制根据需要离开并重新进入
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&lt;>上使用扩展方法计数
function().Count()
    
你可以使用
IEnumerable.Count
扩展方法! 我认为
yield return
用于编译器使用其后面的语句隐式构建基本迭代器。 如果您想要一个更复杂的迭代器,那么您可以以更明确的方式实现它。     

要回复问题请先登录注册