[英]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.