C# 如何生成嵌套的IENumerable?

C# 如何生成嵌套的IENumerable?,c#,methods,yield,C#,Methods,Yield,我知道如何在返回值为IENumerable的方法中生成值 但是嵌套IEnumerable的正确语法是什么 像这样的 public IEnumerable<IEnumerable<int>> GetNestedDigits() { yield return new List<int> { 1 }; } 不能直接嵌套yield-return语句。您必须创建另一个方法: public IEnumerable<IEnum

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

但是嵌套IEnumerable的正确语法是什么

像这样的

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

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

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

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

如果我照字面理解您的所有文本,您可以使用:

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();
}

如果要生成实际值,则必须生成IEnumerable,然后需要另一个方法来调用,如yield return GetDigits;。你想干什么?如果要使用迭代器返回IEnumerable,请创建另一个返回IEnumerable的方法。否则,只需返回例如new[]{1},没有嵌套的产量。您可能在询问关于嵌套迭代器的问题,这些迭代器会自动应答—请调用另一个迭代器方法。这可以是lambda或单独的方法。如果内部枚举来自数据库或集合,则不需要嵌套任何内容,例如:yield return Enumerable.Repeat1,3;产生返回可枚举。重复1,3@请解释你到底想做什么。您所要求的将迫使您使用双循环来获取单个项目。这是你真正想要的吗?内部可枚举性从何而来?这不是嵌套的结果。这是一个单一的收益,返回一个列表,而不是IEnumerableNo需要一个列表,一个新的[]{1}就足够了,我不认为OP想要返回一个具体的collection@Kenneth按照你的意思,没有嵌套收益率。这是一个包含IEnumerable的IEnumerable。OP可能需要一个嵌套的迭代器,而不是一个嵌套的成品。是的,但是它在访问嵌套列表时创建了列表。一旦访问外部可枚举项,它将创建包含其所有项的列表。那不是OP想要的。他还希望通过yield创建内部可枚举项。我猜他的收益率1只是一个example@PanagiotisKanavos好的,你是对的,但是如果你读了这个问题,你就能明白他的意思。实际的术语可能有点奇怪,但是如果你阅读他的伪代码,他的意图是非常清楚的
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<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();
}