通过IEnumerable进行分页

时间:2010-12-17 15:59:47

标签: c# asp.net ienumerable

我有一个IEnumerable对象(IEnumerable<Class>),我想从对象中检索指定的行。因此,如果我在第二页,我想从IEnumerable对象中选择第二行,然后将其传递给另一个类等。

我现在有点陷入困境,有什么想法?

4 个答案:

答案 0 :(得分:11)

查看函数.Take().Skip()。我通常做这样的事情:

IEnumerable<object> GetPage(IEnumerable<object> input, int page, int pagesize)
{
     return input.Skip(page*pagesize).Take(pagesize);
}

答案 1 :(得分:2)

如果我正确理解了您的要求,那么这种分页机制应该有效:

int pageSize = 10;
int pageCount = 2;

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

此示例显示每页10行,页码为2.因此,它将跳至第2页并占据该页面的第一行。

答案 2 :(得分:1)

假设页面和行从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)。

答案 3 :(得分:0)

我在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