【发布时间】:2010-12-17 15:59:46
【问题描述】:
我有一个 IEnumerable 对象 (IEnumerable<Class>),我想从该对象中检索指定的行。因此,如果我在第二页,我想从 IEnumerable 对象中选择第二行,然后将其传递给另一个类等。
我现在有点卡住了,有什么想法吗?
【问题讨论】:
标签: c# asp.net ienumerable
我有一个 IEnumerable 对象 (IEnumerable<Class>),我想从该对象中检索指定的行。因此,如果我在第二页,我想从 IEnumerable 对象中选择第二行,然后将其传递给另一个类等。
我现在有点卡住了,有什么想法吗?
【问题讨论】:
标签: c# asp.net ienumerable
查看函数.Take() 和.Skip()。我通常会这样做:
IEnumerable<object> GetPage(IEnumerable<object> input, int page, int pagesize)
{
return input.Skip(page*pagesize).Take(pagesize);
}
【讨论】:
如果我正确理解了您的要求,应该可以使用这种分页机制:
int pageSize = 10;
int pageCount = 2;
iEnumerable.Skip(pageSize*pageCount).Take(pageSize);
此示例显示每页 10 行,页码为 2。因此,它将跳到第 2 页并占据该页的第一行。
【讨论】:
Take 会在跳过后的前 2 个结果,但 Skip 部分是正确的想法。
假设页面和行从 1 开始,并且每页有固定的行数(比如 10),您需要将页码和行转换为索引,如下所示:
页 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 ... 第 1 行 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 ... ↓ 索引 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)。
【讨论】:
我已经在 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
【讨论】: