Пример переменных:
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
item
Я обычно помещаю эту логику деления и округления в метод целочисленного расширения:
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)