自定义分页问题

时间:2011-04-19 17:19:18

标签: c# algorithm

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

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

有人能指出我正确的方向吗?我正在努力确切地知道我甚至可以搜索什么来找到答案。

4 个答案:

答案 0 :(得分:1)

这是我的看法。它与Kyle's非常相似,只是它使用扩展方法,并且当要显示的页面高于总页数时它不会失败。

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);
        }
    }
}

答案 1 :(得分:0)

这不是完美的,但你应该得到漂移。基本上,你只需要确保使用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;
}

答案 2 :(得分:0)

鉴于您总共有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);
}

e.g。

  • selectedIndex = 1收益firstIndex = 1; lastIndex = 5;
  • selectedIndex = 8收益firstIndex = 6; lastIndex = 10;
  • selectedIndex = 10收益firstIndex = 6; lastIndex = 10;

答案 3 :(得分:0)

我的尝试:

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,则钳位(x,min,max)为x; min,如果x&lt; min,max if x&gt;最大。我想出了开始。这是当前的位置减去三角洲。除非当前在最高计数项目中,否则delta为count / 2 ,然后进行调整。结束是开始+计数。从那里,它是迭代。