我有一个IEnumerable对象(IEnumerable<Class>
),我想从对象中检索指定的行。因此,如果我在第二页,我想从IEnumerable对象中选择第二行,然后将其传递给另一个类等。
我现在有点陷入困境,有什么想法?
答案 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