Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分页上限和下限_C#_Linq_Pagination - Fatal编程技术网

C# 分页上限和下限

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| 我似乎做得不对。到目前为止,

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

我希望总是有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<总页数?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很高兴您选择了这个解决方案,它肯定是更好的实现。