Получить страницу из коллекции, не проходя мимо последней страницы? - PullRequest
2 голосов
/ 18 июля 2011

У меня есть коллекция предметов: ICollection<T> MyCollection

Мне интересно, есть ли способ получить подколлекцию предметов (разбитых на страницы), не проходя мимо последней страницы ... Сейчас она возвращаетсяпустой список, потому что я продолжаю проходить мимо доступных страниц.

Например, если у MyCollection есть 10 элементов, и я спрашиваю о странице 5 (3 элемента на странице), я получаю пустую коллекцию.Вместо этого мне бы очень хотелось, чтобы была последняя страница (например, страница 4, 1 элемент).Не уверен, что здесь делать.Если есть способ LINQ сделать это, это было бы круто.

Ответы [ 2 ]

7 голосов
/ 18 июля 2011

Пример переменных:

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)

2 голосов
/ 18 июля 2011

"Чистый" LINQ:

var result = (arr.Count > (page - 1) * perPage ? 
            arr.Skip(perPage * (page - 1)) : 
                arr.Skip(arr.Count / perPage * perPage))
                .Take(perPage);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...