【问题标题】:Length of Yield Return收益回报的长度
【发布时间】:2011-02-14 23:44:44
【问题描述】:

有没有办法从函数中获取收益返回的数量无需保留计数器变量?例如?

  IEnumerable<someobject> function
  {
      for loop
          yield return something

      int numberreturned = ....
  }

【问题讨论】:

    标签: c# yield-return


    【解决方案1】:

    这会破坏yield return 的目的。

    使用yield return 意味着您想要实现一个生成器(MSDN 将其称为迭代器块),即计算它返回的每个值的对象动态。根据定义,生成器可能是无限的,因此控制可能永远不会离开您的 for 循环。

    流的工作方式相同。要计算流的长度,您必须将其耗尽,并且您可能永远不会从这样做中返回。毕竟,数据可能来自无限来源(例如/dev/zero)。

    【讨论】:

      【解决方案2】:

      没有。如果没有计数器,这是不可能的 -- 无法从函数本身访问返回的流。 (如果可能的话,我想知道它会带来什么样的奇怪语义/怪癖?)

      但是,即使问题不希望得到这样的响应,也可以使用计数器(如果有疑问)完全可以;-) 请记住,这种形式的构造在流中的下一个项目时调用的闭包周围是“神奇的” (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
      }
      

      编码愉快。

      【讨论】:

        【解决方案3】:

        您可以在函数返回的 IEnumerable 上使用扩展方法计数

        function().Count()
        

        【讨论】:

        • 这将对方法 return 值起作用——但会强制评估(可能永远不会终止)。
        【解决方案4】:

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

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

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

        【讨论】:

        • 这将适用于方法 return 值——但会强制评估(可能永远不会终止)。
        猜你喜欢
        • 1970-01-01
        • 2011-05-27
        • 2012-01-14
        • 1970-01-01
        • 2018-01-23
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        相关资源
        最近更新 更多