0

我正在尝试对集合进行迭代,如果集合为空,则调用将获得下一组结果的增量方法。当增量表示没有更多结果时,则中断的产量;

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

我在下面尝试了一个示例,但它在一次迭代后停止。我希望有一种更简单的方法可以做到这一点(或者至少有可能只是我有一个错误)。

static void Main(string[] args)
{
    var query = new Query();

    foreach(var s in query.Q1())
    {
        Console.WriteLine(s);
    }

    foreach (var s in query.Q2())
    {
        Console.WriteLine(s);
    }

    Console.ReadLine();
}

public class Query
{
    int i = 0;
    bool complete;
    List<string> q1 = new List<string>();
    List<string> q2 = new List<string>();

    public IEnumerable<string> Q1()
    {
        if (complete)
        {
            yield break;
        }
        if (!q1.Any() && !complete)
        {
            Increment();
        }
        if (q1.Any())
        {
            foreach (var s in q1)
            {
                yield return s;
            }
        }
    }

    public IEnumerable<string> Q2()
    {
        if (complete)
        {
            yield break;
        }
        if (!q2.Any() && !complete)
        {
            Increment();
        }
        if (q2.Any())
        {
            foreach (var s in q2)
            {
                yield return s;
            }
        }
    }

    void Increment()
    {
        if (i < 10)
        {
                    // simulate getting two types of data back (parent and two children) from datasource
            q1.Add((1 * (i + 1)).ToString());
            q2.Add("A: " + (1 * (i + 1)).ToString());
            q2.Add("B: " + (1 * (i + 1)).ToString());

            i++;
        }
        else
        {
            complete = true;
        }
    }
}

结果:

1
A: 1
B: 1

关于更好的方法或我哪里出错的任何想法?

编辑

这是我的粗略和现成的修复:

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;
        }
    }
}
4

1 回答 1

1

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

if (q1.Any())

当你调用Q2迭代器时,你在之后退出它

if (q2.Any())
{
     foreach (var s in q2)
     {
         yield return s;
     }
}

这个foreach循环只执行一次,它只返回三个项目,这些项目是在迭代器q2的单次Increment调用期间添加的。Q1

目前还不是很清楚你想要实现什么,但这里是你可以使用循环生成迭代器返回值的方式

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;
    }
}
于 2012-10-27T23:22:38.200 回答