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