自定义分页问题

本文关键字:问题 分页 自定义 | 更新日期: 2023-09-27 17:50:40

我正在创建一个自定义分页解决方案,但我正在努力想出一个算法来解决这个问题。

我需要创建一个索引位置,例如1 2 3 4 5(其中1表示选定的索引)。当你考虑到我需要应用上边界时,这显然会变得更加复杂,例如,如果有10个页面,当前选择的索引是8,我希望包含6 7 8 9 10。如果我们选择最后一页,将变成6 7 8 9 10

有谁能给我指出正确的方向吗?

自定义分页问题

我正在努力知道我到底可以搜索什么来找到答案。

以下是我的看法。除了使用扩展方法之外,它与Kyle的方法非常相似,并且当要显示的页面数量大于页面总数时,它不会失败。

public IEnumerable<int> GetDisplayedPages(int currentPage, 
                                          int totalPages, 
                                          int pagesToDisplay)
{
    if (totalPages <= pagesToDisplay) {
        return Enumerable.Range(1, totalPages);
    } else {
        if (pagesToDisplay % 2 == 1) pagesToDisplay -= 1;
        if (currentPage - (pagesToDisplay / 2) <= 0) {
            return Enumerable.Range(1, pagesToDisplay + 1);
        } else if (currentPage + (pagesToDisplay / 2) >= totalPages) {
            return Enumerable.Range(totalPages - pagesToDisplay, pagesToDisplay + 1);
        } else {
            return Enumerable.Range(Convert.ToInt32(currentPage - (pagesToDisplay / 2)), pagesToDisplay + 1);
        }
    }
}

这并不完美,但您应该了解其中的含义。基本上,你只需要确保正确地迭代使用if-else-if-else逻辑考虑到开始/停止点

public List<int> GetIndices(int min, int current, int count, int max)
{
    List<int> indexes = new List<int>();
    int half = count / 2
    if(current - (half) < min)
    {
        for(int i = 0; i < count && i < max; i++)
        {
            indexes.add(i);
        }
    }
    else if(current + (half) > max)
    {
        for(int i = 0; i < count && max - i > 0; i++)
        {
            indexes.add(max - i);
        }
    }
    else
    {
        for(int i = 0; i < count; i++)
        {
            indexes.add(current - half + i)
        }
    }
    return indexes;
}

假设您总共有indexTotal(在您的情况下为10)和indexDisplay(5)的可显示量,您可以计算以下内容:

firstIndex = max(1, selectedIndex - indexDisplay/2);
lastIndex = firstIndex + indexDisplay - 1;
if (lastIndex > indexTotal) {
    lastIndex = indexTotal;
    firstIndex = max(1, lastIndex - indexDisplay + 1);
}

  • selectedIndex = 1firstIndex = 1; lastIndex = 5;
  • selectedIndex = 8生成firstIndex = 6; lastIndex = 10;
  • selectedIndex = 10生成firstIndex = 6; lastIndex = 10;

My try:

IEnumerable<int> GetIndices(int min, int current, int count, int max)
{
    int delta = current > max - count? current - (max - count) : count / 2;         
    int start = Math.Max(min, current - delta);
    int end = Math.Min(max, start + count);
    for (int i=start; i <= end; i++) yield return i;
}

List<int> GetIndices(int min, int current, int count, int max)
{   
    List<int> list = new List<int>();     
    int delta = current > max - count? current - (max - count) : count / 2;         
    int start = Math.Max(min, current - delta);
    int end = Math.Min(max, start + count);
    for (int i=start; i <= end; i++) list.Add(i);
    return list;
}

这是如何工作的-这或多或少是箝位功能。给定x, min, max,如果x>= min且x <= max,则clamp(x, min, max)为x;最小if x <如果x> Max,则取最小值。我算出起点。它是当前位置减去delta。增量是count/2 ,除非当前是在顶部计数项目,然后它被调整。结束是start + count。从这里开始迭代