繁体   English   中英

如何扩展IEnumerable <T> 从Web服务加载我的收藏集?

[英]How can I extend IEnumerable<T> to load my collection from a web service?

我一直在想知道如何实现Enumerable<T> / IEnumerator<T>来满足以下要求:

  1. 我调用网络服务来创建查询
  2. 我轮询Web服务以查找何时可以返回结果
  3. 一旦Web服务准备好返回结果,我就调用一个方法(例如GetNext(n) )从中获取n个项目
  4. 一旦GetNext(n)返回少于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服务上调用一个名为GetNext(n)的方法。

除非您有理由不明确地实现接口,否则通常应使用迭代器块来创建此类序列。 它会处理样板代码,只为您提供有趣的实现。 像这样的问题通常看起来类似于以下方面:

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

然后,可以使用SelectMany将组列表展平为单个项目的列表:

public static IEnumerable<Foo> GetItems(int pageSize)
{
    return GetPages(pageSize).SelectMany(x => x);
}

使用Rx反应性扩展和缓冲区扩展方法。 (含义是IObservable而不是IEnumberable)。 似乎完全适合您的用例!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM