自定义分页问题
本文关键字:问题 分页 自定义 | 更新日期: 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 = 1
产firstIndex = 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。从这里开始迭代如果x>