Пейджинг через IEnumerable - PullRequest
       2

Пейджинг через IEnumerable

5 голосов
/ 17 декабря 2010

У меня есть объект IEnumerable (IEnumerable<Class>), и я хотел бы получить указанную строку из объекта. Поэтому, если я на второй странице, я бы хотел выбрать вторую строку из объекта IEnumerable, а затем передать его другому классу и т. Д.

Я сейчас немного застрял, есть идеи?

Ответы [ 4 ]

11 голосов
/ 17 декабря 2010

Посмотрите на функции .Take() и .Skip(). Я обычно делаю что-то вроде этого:

IEnumerable<object> GetPage(IEnumerable<object> input, int page, int pagesize)
{
     return input.Skip(page*pagesize).Take(pagesize);
}
2 голосов
/ 17 декабря 2010

Если я правильно понимаю ваши требования, что-то вроде этого механизма подкачки должно работать:

int pageSize = 10;
int pageCount = 2;

iEnumerable.Skip(pageSize*pageCount).Take(1);

В этом примере показано 10 строк на страницу и номер страницы 2. Итак, он перейдет на страницу 2 и займет первую строку на этой странице.

1 голос
/ 17 декабря 2010

Предполагая, что страницы и строки начинаются с 1, а количество страниц на странице фиксировано (скажем, 10), вам нужно преобразовать номер страницы и строку в индекс следующим образом:

Page    1  1  1  1  1  1  1  1  1  1  2  2  2  2  2  2  2  2  2  2  3  3  3 ...
Row     1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  6  7  8  9 10  1  2  3 ...
                                         ↓
Index   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

Код:

int page = 2;
int row = 2;

int rowsPerPage = 10;

IEnumerable<MyClass> source = ...

MyClass result = source.ElementAt((page - 1) * rowsPerPage + (row - 1));

Таким образом, чтобы получить строку 2 на странице 2, вам нужно пропустить первую страницу (10 элементов) и затем взять второй элемент (индекс 1 на этой странице).

0 голосов
/ 22 июля 2015

Я реализовал динамическое решение в vb.net, надеюсь, полезно:

 <Runtime.CompilerServices.Extension()>
    Public Function Paginate(Of T As {Class})(source As T, skip As Integer, take As Integer) As T
    If source IsNot Nothing AndAlso TypeOf source Is IEnumerable Then

        Dim chunk = (From c In DirectCast(source, IEnumerable)).Skip(skip).Take(take).ToList
        If chunk.Count = 0 Then Return Nothing

        Return AutoMapper.Mapper.Map(chunk, GetType(T), GetType(T))
    End If
    Return source
End Function
...