仅在迭代时从Api获取结果

时间:2018-12-22 07:50:08

标签: c# ienumerable api-design

我有一个Api,可在页面中获取结果并将其发送回客户端。在知道客户端将如何实际迭代我的项目之前,如何减少从api提取页面的次数。 IE可以说一个客户只接受5个Foo项目。我的api当前将获取所有页面,即使客户端仅使用5个项目。除了传递要获取的项目数量之外,还有其他方法吗?

var actualItems = _pagedApiCollection.GetItems<Foo>().Take(5).ToList();

Api通话

 public IEnumerable<Foo> GetItems<Foo>()
 {
    public List<object> allElements = new List<object>();

       do
        {
            currentpage =  _pagedApi.GetNextPage(reqid);


            allElements.AddRange(currentpage.Items); 

        } while (currentpage.HasNextPage);

   IEnumerable<Foo> myNewEnumerable = allElements.Cast<Foo>();
   myNewEnumerable; 

}   

1 个答案:

答案 0 :(得分:1)

您可以通过逐一得出结果来将其转变为适当的可枚举方法。

public IEnumerable<Foo> GetItems<Foo>() {
    Page currentPage;
    do
    {
        currentPage =  _pagedApi.GetNextPage(reqid);

        foreach (var item in currentPage)
            yield return (Foo)item;

    } while (currentpage.HasNextPage);
}

您仍然需要一次获取一页,因此如果您要获取6张,但是_pagedApi的页面大小是5张,您将获取2页而不是所有人。这样的开销可能要比逐个而不是按页获取每个记录的开销小得多。

这是IEnumerable接口的优势,它在后台创建了一个状态机,用于跟踪循环的当前状态(如果需要详细说明,可以在SO或MSDN上搜索它)。 / p>