gpt4 book ai didi

c# - 如何从偶尔发出非常慢请求的 IEnumerable 中有效地跳过项目?

转载 作者:太空宇宙 更新时间:2023-11-03 19:19:38 25 4
gpt4 key购买 nike

我有以下代码:

class Program
{
static void Main(string[] args)
{
foreach (var item in GetEnumerable().Skip(100))
{
Console.WriteLine(item);
}
}
static IEnumerable<int> GetEnumerable(int? page = null, int limit = 10)
{
var currentPage = page ?? 1;
while (true)
{
Thread.Sleep(1000); // emulates slow retrieval of a bunch of results
for (int i = limit * (currentPage - 1); i < limit * currentPage; i++)
{
yield return i;
}
currentPage++;
}
}
}

我希望能够使用 .Skip(n) 有效地跳过我不需要的结果。因此,例如,如果我使用 Skip(100) 并且每个请求检索 10 个项目,则应完全跳过前 10 个请求。

我可以使用一种模式来实现这一目标吗?

最佳答案

您可以创建自己的 IEnumerable<int>键入并提供您自己的 Skip 实现:

public class PagedEnumerable : IEnumerable<int>
{
private readonly int currentPage;
private readonly int limit;

public PagedEnumerable(int currentPage, int limit)
{
this.currentPage = currentPage;
this.limit = limit;
}

public PagedEnumerable Skip(int count)
{
int pages = count / this.limit;
return new PagedEnumerable(this.currentPage + pages, this.limit);
}

public IEnumerator<int> GetEnumerator()
{
int pageNo = this.currentPage;
while (true)
{
Thread.Sleep(1000);
for (int i = this.limit * (pageNo - 1); i < (this.limit * pageNo); i++)
{
yield return i;
}
pageNo++;
}
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}

然后您可以替换您的 GetEnumerable与:

static PagedEnumerable GetEnumerable(int? page = null, int limit = 10)
{
var currentPage = page ?? 1;
return new PagedEnumerable(currentPage, limit);
}

关于c# - 如何从偶尔发出非常慢请求的 IEnumerable 中有效地跳过项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com