【问题标题】:Pagination Upper and Lower Limit分页上下限
【发布时间】:2018-08-10 20:27:22
【问题描述】:

我正在尝试获取分页按钮的上限和下限。

我希望总是有 9 个按钮。因此,最初当前页面索引为 1 时,它将是:

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

所以我的下限是 1,我的上限是 9。

当当前页面索引达到 8 时,我希望分页看起来像这样:

| 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

说出 15 和当前页面索引现在为 14 的总页面,分页看起来像:

| 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |

我似乎无法做到恰到好处。到目前为止,我使用 LINQ 的尝试是(这与我想要它做的事情相去甚远):

LowerCount = PageIndex;
HigherCount = (int)PageIndex + 5 < TotalPages ? PageIndex + 5 : TotalPages;

【问题讨论】:

  • 您能否提供更多逻辑,因为您可能会使用TakeWhileSkipWhile 方法。还有Math.MinMath.Max 方法。
  • 你还想要什么?我用 LINQ 对此进行了多次尝试,但我无法弄清楚。
  • 这是一个网站吗?我有一个谷歌式分页的工作模型,仿照此:jasonwatmore.com/post/2015/10/30/…。它是 10 个按钮,而不是 9 个。我更喜欢将它放在自己的类中,以便对其进行单元测试。如果你有兴趣,我可以把它贴在 GitHub 上。

标签: c# linq pagination


【解决方案1】:

使用 LINQ,您可以生成具有选定限制的所有页面:

int totalPages = 15;
int range = 4;
int currentPage = 8;

Func<int> handleLimits = 
    () => Math.Min(Math.Max(1, totalPages - 2 * range), Math.Max(1, currentPage - range));

IList<int> pages = Enumerable
    .Range(handleLimits(), range * 2 + 1)
    .TakeWhile(p => p <= totalPages)
    .ToList();

输出:

| 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

您可以调整参数以查看它们是否满足您的要求。当然限制是First()Last() 元素。

【讨论】:

  • 我试过这个但得到-2。总页数 = 6,当前页数 = 0。
  • @Bad Dub 是的,第一部分也应该有限,我会更新答案。
  • 感谢您的回答,这完全符合我的标准并在我的项目中实施。谢谢您的帮助。此外,包含一个 Func 也是一个不错的选择。
  • @BadDub 很高兴您选择了这个解决方案,它绝对是更好的实现方式。
【解决方案2】:

有 3 种情况。索引“接近”到开头,索引“接近”到结尾,或者索引在中间。检查这些情况并相应地确定上限值和下限值。

// This deterimines the maximum number of pages to show on each side of
// the current page.
int Range = 4
// If the index is close to the beginning
if(PageIndex <= Range + 1)
{
    LowerCount = 1;
    HighCount = Math.Min(2*Range + 1, TotalPages);
}
// If the index is close to the end but not the beginning
else if(TotalPages - PageIndex <= Range)
{
    LowerCount = TotalPages - (2*Range);
    HighCount = TotalPages;
}
// If the index is in the middle.
else
{
    LowerCount = CurrentIndex - Range;
    HighCount = CurrentIndex + Range;
}

【讨论】:

    【解决方案3】:

    您可以通过以下方式解决,但请原谅我的假设。因为我不知道很多细节。

    var start = pages.FirstOrDefault(page => page >= (Math.Round(current - 4), 0);
    var end = pages.FirstOrDefault(page => page >= (Math.Round(current + 4), 0);
    
    var pagination = pages.SkipWhile(page => page != start).TakeWhile(page => page != end);
    

    您所要做的就是计算您的起点和终点,它会收集特定的范围。尽管有一些可靠的方法可用。请注意,我可能搞砸了小于或大于,但这个想法应该是合理的。

    【讨论】:

    • @Johnny 我不擅长阅读,我会修改以将其放在那里。顺便说一句,我喜欢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 2011-11-28
    • 1970-01-01
    • 2010-12-21
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多