【问题标题】:How to yield a nested IENumerable?如何产生嵌套的 IENumerable?
【发布时间】:2017-01-19 21:00:32
【问题描述】:

我知道如何在返回值IENumerable的方法中产生值

public IEnumerable<int> GetDigits()
{
    yield return 1;
    yield return 1;
    yield return 1;
}

但是嵌套IEnumerable&lt;IEnumerable&lt;int&gt;&gt; 的正确语法如何?

public IEnumerable<IEnumerable<int>> GetNestedDigits()
{
    yield return yield return 1; //??
}

【问题讨论】:

  • 如果你想产生实际值,你必须产生一个IEnumerable,然后你需要另一个方法来调用,比如yield return GetDigits();
  • 你想做什么?如果要使用 iterator 返回 IEnumerable,请创建一个返回 IEnumerable 的 different 方法。否则只返回例如new []{1}
  • 不存在嵌套收益。您可能在问 nested iterators 自己回答 - 调用另一个迭代器方法。这可以是 lambda 或单独的方法。如果内部枚举来自数据库或集合,则不需要嵌套任何东西'
  • 转帖:yield return Enumerable.Repeat(1, 3); yield return Enumerable.Repeat(1, 3); ...
  • @c0rs 请说明您实际上想要做什么。你所问的将迫使你使用双循环来获取单个项目。这是你真正想要的吗?内部枚举从何而来?

标签: c# methods yield


【解决方案1】:

您不能直接嵌套yield return 语句。您必须创建另一个方法:

public IEnumerable<IEnumerable<int>> GetNestedDigits()
{
    yield return GetNestedEnumerable();
}

public IEnumerable<int> GetNestedEnumerable()
{
    yield return 1;
}

【讨论】:

    【解决方案2】:

    类似的东西

    public IEnumerable<IEnumerable<int>> GetNestedDigits()
    {
        yield return new List<int>
        {
            1
        };
    }
    

    【讨论】:

    • 这不是嵌套收益。这是一个返回列表的单一收益,而不是 IEnumerable
    • 不需要列表,new []{1} 就足够了,我认为 OP 不想返回具体集合
    • @Kenneth 没有您所说的嵌套收益。那一个包含IEnumerable&lt;int&gt;的IEnumerable。 OP 可能应该要求一个 嵌套的迭代器,而不是一个嵌套的 yield。
    • 是的,但是它在访问嵌套列表时会创建列表。一旦您访问外部 Enumerable,它将创建包含所有项目的列表。这不是OP想要的。他也希望通过 yield 来创建内部的 Enumerable。我猜他的yield return 1 只是一个例子
    • @PanagiotisKanavos 好的,你是对的,但如果你阅读了这个问题,你就会明白他的意思。实际的术语可能是,但如果你阅读他的伪代码,他的意图就很清楚了
    【解决方案3】:

    如果我按字面意思理解你的所有文字,你可以这样做:

    IEnumerable<IEnumerable<int>> GetNestedDigits()//{1, 2, 3}, {1, 2, 3}, {1, 2, 3}
    {
      yield return new int[] { 1, 2, 3 };
      yield return new int[] { 1, 2, 3 };
    }
    

    您必须声明某种实现 IEnumerable 的集合并返回它。您不能直接嵌套收益。也许更接近的方法是声明私有 IEnumerables,然后返回。

    IEnumerable<int> GetNestedDigitsA()
    {
      yield return 1;
      yield return 2;
      yield return 3;
    }
    
    IEnumerable<int> GetNestedDigitsB()
    {
      yield return 1;
      yield return 2;
      yield return 3;
    }
    
    IEnumerable<IEnumerable<int>> GetNestedDigits()//{1, 2, 3}, {1, 2, 3}
    {
      yield return GetNestedDigitsA();
      yield return GetNestedDigitsB();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2012-06-27
      • 2017-09-04
      • 2018-05-23
      相关资源
      最近更新 更多