C# 分页上限和下限
我正在尝试获取分页按钮的上限和下限 我希望总是有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的尝试是(这与我希望它实现的目标相去甚远):C# 分页上限和下限,c#,linq,pagination,C#,Linq,Pagination,我正在尝试获取分页按钮的上限和下限 我希望总是有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| 我似乎做得不对。到目前为止,
LowerCount=PageIndex;
HigherCount=(int)PageIndex+5<总页数?PageIndex+5:总页数;
共有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;
}
//这决定了要在页面两侧显示的最大页数
//当前页面。
整数范围=4
//如果索引接近开始处
如果(Pindex)有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;
}
//这决定了要在页面两侧显示的最大页数
//当前页面。
整数范围=4
//如果索引接近开始处
如果使用LINQ(PageIndex),则可以生成具有选定限制的所有页面:
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();
您可以调整参数以查看它们是否满足您的要求。当然限制是First()
和Last()
元素。使用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();
你可以调整参数,看看它们是否满足你的要求。当然限制是First()
和Last()
元素。你可以用以下方式处理,不过请原谅我的假设。因为我不知道太多细节
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);
你所要做的就是计算你的起点和终点,它会收集到具体的范围。虽然你有一些可靠的方法可用。注意,我可能会搞砸小于或大于,但这个想法应该是正确的。你可以用以下方式处理,不过请原谅我的假设。因为我不知道有很多细节
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);
你所要做的就是计算你的起点和终点,它将收集具体的范围。虽然你有一些可靠的方法。注意,我可能会搞砸小于或大于,但这个想法应该是正确的。你能提供更多的逻辑吗,因为你可能会使用TakeWhile
或SkipWhile
approach。还有Math.Min
和Math.Max
approach。你还想要什么?我已经用LINQ做了很多尝试,但我想不出来。这是为了一个网站吗?我有一个谷歌风格分页的工作模型,模型就是这样:。它有10个按钮,而不是9个。我更喜欢在自己的类中使用它所以它可以进行单元测试。如果你感兴趣,我可以把它放在GitHub上。你能提供更多的逻辑吗,因为你可以潜在地使用TakeWhile
或SkipWhile
方法。还有Math.Min
和Math.Max
方法。你还想要什么呢?我已经用LINQ做了很多尝试,我无法实现这是为了一个网站吗?我有一个谷歌式分页的工作模型,它是以这个为模型的:。它有10个按钮,而不是9个。我更喜欢它在自己的类中,这样它就可以进行单元测试。如果你感兴趣,我可以把它放在GitHub上。@Johnny我阅读很差,我会修改它放在那里。顺便说一句,我喜欢你的答案。@Johnny我在rea很差丁,我会修改,把它放在那里。顺便说一句,我喜欢你的答案。我试过了,但得到了-2。总页数=6,当前页数=0。@Bad Dub Yup,第一部分也应该是有限的,我会更新答案。谢谢你的答案,这完全符合我的标准,并在我的项目中实施。谢谢你的帮助。还有一个函数的加入很好的操作。@BadDub很高兴你选择了这个解决方案,它肯定是更好的实现。我尝试了这个解决方案,但得到了-2。总页数=6,当前页数=0。@Bad Dub是的,第一部分也应该是有限的,我将更新答案。谢谢你的答案,这完全符合我的标准,并在我的项目中实现。谢谢你的帮助lp.另外,包含Func是一个很好的选择。@BadDub很高兴您选择了这个解决方案,它肯定是更好的实现。