我有一系列项目:ICollection<T> MyCollection
我想知道是否有办法在没有经过最后一页的情况下获得项目的子集(分页)...现在它返回一个空列表,因为我继续经过可用页面。
例如,如果MyCollection
有10个项目并且我要求第5页(每页3个项目),我会得到一个空集合。相反,我真的想要最后一页(恰好是第4页,1项)。不知道该怎么做。如果有一种LINQ方式可以实现这一目标。
答案 0 :(得分:7)
示例变量:
int page = 5;
int itemPerPage = 3;
//MyCollection.Count == 10;
逻辑:
// make sure there are any items and that itemsPerPage is greater than zero
// to prevent any DivideByZeroExeceptions from being thrown
if (MyCollection.Any() && itemsPerPage > 0)
{
if (page * itemsPerPage > MyCollection.Count)
{
// if page is past collection change to the last page
page = (int)Math.Ceiling((float)MyCollection.Count / (float)itemsPerPage);
}
else if (page < 1)
{
// if page is before collection change to 1
page = 1;
}
// skip pages and select the number of pages
MyCollection.Skip((page - 1) * itemsPerPage).Take(itemsPerPage);
}
在这种情况下,page = 5
位于集合(5 * 3 == 12)
之外,因此页面会重置为10 divided and rounded up by 3 == 4
。最后,它会跳过(4 - 1) * 3 == 9
,然后选择3
,这将是包含1
项目的最后一页
我通常将这种分而治的逻辑放入整数扩展方法中:
public static class IntExtensions
{
public static int DivideByAndRoundUp(this int number, int divideBy)
{
return (int)Math.Ceiling((float)number / (float)divideBy);
}
}
可以让你写page = MyCollection.Count.DivideAndRoundUp(itemsPerPage)
答案 1 :(得分:2)
“Pure”LINQ:
var result = (arr.Count > (page - 1) * perPage ?
arr.Skip(perPage * (page - 1)) :
arr.Skip(arr.Count / perPage * perPage))
.Take(perPage);