【问题标题】:Paging through an IEnumerable通过 IEnumerable 进行分页
【发布时间】:2010-12-17 15:59:46
【问题描述】:

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

我现在有点卡住了,有什么想法吗?

【问题讨论】:

    标签: c# asp.net ienumerable


    【解决方案1】:

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

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

    【讨论】:

    • 值得一提的是,这是从0开始的。要调用第一页,您需要传递 0。
    • 为什么是的,因为进行基于 1 的索引是不必要的复杂。尤其是在处理使用基于 0 的索引的 C# 时。
    • 它是从0开始的,真的值得一提吗?我想这是一个基线假设。值得一提的是,如果出于某种奇怪的原因它是基于 1 的
    【解决方案2】:

    如果我正确理解了您的要求,应该可以使用这种分页机制:

    int pageSize = 10;
    int pageCount = 2;
    
    iEnumerable.Skip(pageSize*pageCount).Take(pageSize);
    

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

    【讨论】:

    • 其实 Take 会在跳过后的前 2 个结果,但 Skip 部分是正确的想法。
    • @Daniel - 是的,你是对的。谢谢你。我已经编辑了我的回复。
    • 你的算术有点不对劲。第二页上的第二行的索引为 11,而不是 20(假设每页 10 行,并且行和页从索引 1 开始)。
    【解决方案3】:

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

    【讨论】:

    • -1 对于原始要求而言,极其复杂且效率低下。
    • @Timothy Baldridge:如果您这样做是为了获取页面上的每个元素,那么效率会很低。但是 OP 声明他只想在特定页面上获得一个元素。所以我不会说简单的 ElementAt 在这里过于复杂或效率低下。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 2013-07-15
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      相关资源
      最近更新 更多