簡體   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