[英]How can I extend IEnumerable<T> to load my collection from a web service?
我一直在想知道如何實現Enumerable<T>
/ IEnumerator<T>
來滿足以下要求:
GetNext(n)
)從中獲取n個項目 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.