【发布时间】:2023-03-24 13:20:01
【问题描述】:
假设我有一些神奇的分页黑盒类,它使用pageIndex 和pageSize 检索数据,如下所示:
public class PaginatedList<T>
{
// ...
// Chops up the internally stored list into pages of size "pageSize",
// then returns the page stored at index "pageIndex".
public IEnumerable<T> Get(int pageIndex, int pageSize)
{
// Magic black box code goes here.
}
// ...
}
现在假设我有一个驱动类想要使用这个PaginatedList 类,但是想要通过使用skip 和take 参数来实现分页。当然,如果我想要 skip 的偏移量恰好可以被我想要 take 的数量整除,那么我可以通过执行以下操作来实现:
public class MyDriver
{
// Bypass the first "skip" elements and return the next "take" elements.
static IEnumerable<T> OffsetGet(PaginatedList<T> myList, int skip, int take)
{
// ASSERT: skip % take == 0 is true.
return myList.Get(skip/take, take);
}
static void Main(string[] args)
{
// ...
// From some dataSource, store some strings in a fancy PaginatedList.
var myList = new PaginatedList<string>(dataSource);
// Skip the first 20 strings and take the next 5 strings.
var myData = OffsetGet(myList, 20, 5);
// ...
}
}
但是,如果我想要 skip 的偏移量是 not可以被我想要take的数量整除?
抱歉,如果这个问题已经在某个地方得到了回答,或者上面的代码太模糊了;这是我在 StackOverflow 上的第一个问题,所以请保持温和。 =]
【问题讨论】:
-
好问题。我想知道这是否只是找到 GCD 的问题,但事情并没有那么简单……您对只获取最少的数据量有多少关心?
-
另外,pageIndex 是从零开始还是从 1 开始?
-
@JonSkeet 谢谢。如果我们最终获取一些额外的记录然后修剪结果,我不会太在意;主要瓶颈是
Get调用,不应多次调用。 -
@astander 嗯,我不确定。我怀疑它必须是从零开始的,因为
OffsetGet(myList, 20, 5)应该等同于Get(4, 5)。不过,我可能会遇到一些错误。随意将索引更改为适合您的任何内容。
标签: c# pagination ienumerable