C# 在使用yield时递增IEnumerator/IEnumerable

C# 在使用yield时递增IEnumerator/IEnumerable,c#,iterator,ienumerable,C#,Iterator,Ienumerable,我试图通过集合生成迭代,如果集合为空,则调用一个增量方法,该方法将获得下一组结果。当增量表示没有更多结果时,则为带中断的产量 我不能(我认为)使用带有MoveNext()等的标准IEnumerator,因为增量方法返回两种不同类型的数据 我试过下面的一个例子,但一次尝试后就停止了。我希望有一个更简单的方法来做到这一点(或者至少是可能的,因为我有一个bug) 有没有更好的方法或者我哪里出了问题 编辑 这是我的粗略和现成的解决方案: public IEnumerable<string>

我试图通过集合生成迭代,如果集合为空,则调用一个增量方法,该方法将获得下一组结果。当增量表示没有更多结果时,则为带中断的产量

我不能(我认为)使用带有MoveNext()等的标准IEnumerator,因为增量方法返回两种不同类型的数据

我试过下面的一个例子,但一次尝试后就停止了。我希望有一个更简单的方法来做到这一点(或者至少是可能的,因为我有一个bug)

有没有更好的方法或者我哪里出了问题

编辑

这是我的粗略和现成的解决方案:

public IEnumerable<string> Q1()
{
    var index = 0;

    if (!complete)
    {
        while (!complete)
        {
            var count = q1.Count();

            if (index + 1 == count)
            {
                for (var x = index; index < count; index++)
                {
                    yield return q1[index];
                }
            }
            else
            {
                Increment();
            }
        }
    }
    else
    {
        foreach (var s in q1)
        {
            yield return s;
        }
    }
}
public IEnumerable Q1()
{
var指数=0;
如果(!完成)
{
而(!完成)
{
var count=q1.count();
如果(索引+1==计数)
{
对于(var x=索引;索引<计数;索引++)
{
收益率回报率q1[指数];
}
}
其他的
{
增量();
}
}
}
其他的
{
foreach(第一季度的var s)
{
收益率;
}
}
}

您只在
q2
列表中添加元素。因此,当您调用
Q1
迭代器时,您将在检查后退出它

if (q1.Any())
调用
Q2
迭代器时,请在

if (q2.Any())
{
     foreach (var s in q2)
     {
         yield return s;
     }
}
这个
foreach
循环只执行一次,并且在单个
Increment
调用
Q1
迭代器期间,它只返回添加到
q2
的三个项目

现在还不清楚您想要实现什么,但下面是使用循环生成迭代器返回值的方法

public IEnumerable<string> Q2()
{
    for (int i = 1; i <= 10; i++) // start from 1
    {
        yield return i.ToString(); // do not multiply by 1
        yield return "A: " + i;    // .ToString() is not necessary 
        yield return "B: " + i;
    }
}
public IEnumerable Q2()
{

对于(inti=1;i是一个吗?尽管收益递增法是我的一个糟糕的例子(不应该在午夜出现!),但在一个长时间运行的过程中,你说我的迭代器提前退出,让我走上了正确的轨道。
if (q2.Any())
{
     foreach (var s in q2)
     {
         yield return s;
     }
}
public IEnumerable<string> Q2()
{
    for (int i = 1; i <= 10; i++) // start from 1
    {
        yield return i.ToString(); // do not multiply by 1
        yield return "A: " + i;    // .ToString() is not necessary 
        yield return "B: " + i;
    }
}