C# 如何扩展IEnumerable以从web服务加载集合?

C# 如何扩展IEnumerable以从web服务加载集合?,c#,.net,ienumerable,ienumerator,C#,.net,Ienumerable,Ienumerator,我一直在想如何实现Enumerable/IEnumerator以满足以下要求: 我调用web服务来创建查询 我轮询web服务以确定它何时准备好返回结果 一旦web服务准备好返回结果,我调用一个方法,例如GetNextn,从中获取n个项目 一旦GetNextn返回的结果少于n个,我就检索到了我的所有项目。 我在试图弄清楚如何让IEnumerable处理我所有的繁重工作时遇到了一些困难,MSDN IEnumerable文档也没有帮助 以下是我的代码的简化版本: public class MyEnum

我一直在想如何实现Enumerable/IEnumerator以满足以下要求:

我调用web服务来创建查询 我轮询web服务以确定它何时准备好返回结果 一旦web服务准备好返回结果,我调用一个方法,例如GetNextn,从中获取n个项目 一旦GetNextn返回的结果少于n个,我就检索到了我的所有项目。 我在试图弄清楚如何让IEnumerable处理我所有的繁重工作时遇到了一些困难,MSDN IEnumerable文档也没有帮助

以下是我的代码的简化版本:

public class MyEnumerable : IEnumerable
{
    private MyWebService _service;
    private int _queryID;

    public MyEnumerable(MyWebService service, int queryID)
    {
        _service = service;
        _queryID = queryID;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return new MyEnumerator(_service, _query);
    }
}

public class MyEnumerator : IEnumerator
{
    private List<QueryResult> _items;  //want to load my items from WebService into this
    private MyWebService _service;
    private int _queryID;
    private int _index = 0;

    private MyEnumerator(MyWebService service, int queryID)
    {
        _service = service;
        _queryID = queryID;
    }

    public object Current
    {
        //what goes here? 
    }

    public bool MoveNext()
    {
        //what goes here? would I call the web service here?
    }

    public void Reset()
    {
        _index = 0;
    }

}

希望这更有意义。假设我可以在我的Web服务上调用一个名为GetNextn的方法,而不是显式地实现接口,除非您有理由不这样做,否则通常应该使用迭代器块来创建这样的序列。它将处理样板代码,只给您留下有趣的实现。像这样的问题通常是这样的:

//you can make this private if you want
public static IEnumerable<IList<Foo>> GetPages(int pageSize)
{
    IList<Foo> nextGroup = ExecuteQuery();
    while (nextGroup.Count == pageSize)
    {
        yield return nextGroup;
        nextGroup = ExecuteQuery();
    }
    if (nextGroup.Any())
        yield return nextGroup;
}

使用Rx反应式扩展和缓冲区扩展方法。意思是,可观察而不是可编号。似乎完全符合您的用例

您不应该轮询web服务以确定它何时有结果,您应该通过某种回调得到通知。lazyberezovsky-我已经尝试实现IEnumerable和IEnumerator,并使用我的自定义枚举器来执行web服务逻辑,但我还没有弄清楚如何正确编写枚举器,我的代码无法编译。@MailmanOdd然后向我们展示您的尝试,或者是一个可以演示问题的简化版本,并具体解释您遇到的问题。@mailmond向我们展示您的代码,以及对于这样的数据流,您会遇到什么异常,我想我会研究Rx的IObservable。枚举数更接近于数组,是围绕数据存储设计的,而可观测值则是基于随时可能出现的数据。嗯,我喜欢这个想法。它使这更简单。我想我将以这种方式实现它,并将其添加到我的WebService消费者类中。非常感谢。
public static IEnumerable<Foo> GetItems(int pageSize)
{
    return GetPages(pageSize).SelectMany(x => x);
}