gpt4 book ai didi

c# - 当 skip 不能被 take 整除时,通过 pageIndex/pageSize 分页实现 skip/take 分页

转载 作者:行者123 更新时间:2023-11-30 16:11:41 26 4
gpt4 key购买 nike

假设我有一些神奇的分页黑盒类,它使用 pageIndexpageSize 检索数据,如下所示:

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类,但是想通过使用skiptake来实现分页参数。当然,如果我想要跳过的偏移量恰好可以被我想要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);

// ...
}
}

但我还能如何有效地实现 OffsetGet(myList, skip, take)(也就是说,无需进行多次 Get(pageIndex, pageSize) 调用)我想要跳过的偏移量不能被我想要接受的数量整除的情况?

如果这个问题已经在某个地方得到回答或者上面的代码太模糊,我们深表歉意;这是我在 StackOverflow 上的第一个问题,所以请保持温和。 =]

最佳答案

注意:此答案存在重大问题(已被接受,因此无法删除)- 例如跳过 28 次,拍摄 5 次。不幸的是,我没有时间解决这个问题。


这在一定程度上取决于您希望在多大程度上平衡代码复杂性和数据获取效率。

总是可以通过获取两倍于您需要的数据来取得成功:

int virtualTake = take * 2;
int virtualSkip = skip / virtualTake;
var bigList = Get(myList, virtualSkip, virtualTake);
int offset = virtualSkip % take;
var pruned = bigList.Skip(offset).Take(take);

但是,在许多情况下,这将获取比您需要的更多的数据。您可以至少针对skip 已经是take 的倍数的情况进行优化,但在其他情况下您可以改进。

例如,如果您想跳过 23 并取 5,上面的代码将有效地跳过 20 并取 10,然后修剪...但您可以跳过 21取而代之的是 7。代码基于以下评论中 astander 的建议:

int newTake = take;
while ((skip % newTake) + take > newTake)
{
newTake++;
}
var bigList = Get(myList, skip / newTake, newTake);
int offset = skip % newTake;
var pruned = bigList.Skip(offset).Take(take);

关于c# - 当 skip 不能被 take 整除时,通过 pageIndex/pageSize 分页实现 skip/take 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24133629/

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