2010-03-03 34 views
3

是否有任何内置的IEnumberable分页函数(或更好的库使用)?我知道有>(),但我发现自己反复实施基本计算来确定给定页面大小的页数。我意识到这是简单的实现,但这就是为什么我希望它已经在图书馆,我只是错过了它。寻呼IEnumerable数据集

通过分页我的意思是一个指向当前记录的指针,并满足以下概念。

.PageSize < - 获取/设置页面大小 。去年< - 最后一页 .Current < - 当前页面 .JumpTo(PAGENUMBER)

与故障保险柜,以确保您在正确的结束如果页面大小或设置大小发生变化,则放置

回答

2

您可以使用围绕列表by Rob ConeryPagedList包装。还有一个由Troy Goode扩展版本。

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace System.Web.Mvc 
{ 
    public interface IPagedList 
    { 
     int TotalCount 
     { 
      get; 
      set; 
     } 

     int PageIndex 
     { 
      get; 
      set; 
     } 

     int PageSize 
     { 
      get; 
      set; 
     } 

     bool IsPreviousPage 
     { 
      get; 
     } 

     bool IsNextPage 
     { 
      get; 
     }  
    } 

    public class PagedList<T> : List<T>, IPagedList 
    { 
     public PagedList(IQueryable<T> source, int index, int pageSize) 
     { 
      this.TotalCount = source.Count(); 
      this.PageSize = pageSize; 
      this.PageIndex = index; 
      this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList()); 
     }  

     public PagedList(List<T> source, int index, int pageSize) 
     { 
      this.TotalCount = source.Count(); 
      this.PageSize = pageSize; 
      this.PageIndex = index; 
      this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList()); 
     } 

     public int TotalCount  
     { 
      get; set; 
     } 

     public int PageIndex  
     { 
      get; set; 
     } 

     public int PageSize 
     { 
      get; set; 
     } 

     public bool IsPreviousPage 
     { 
      get 
      { 
       return (PageIndex > 0); 
      } 
     } 

     public bool IsNextPage 
     { 
      get 
      { 
       return (PageIndex * PageSize) <=TotalCount; 
      } 
     }   
    } 

    public static class Pagination 
    { 
     public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, int index, int pageSize) 
     { 
      return new PagedList<T>(source, index, pageSize); 
     } 

     public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, int index) 
     { 
      return new PagedList<T>(source, index, 10); 
     }   
    } 
} 
+0

看起来很完美,这正是我一直在寻找 – 2010-03-03 22:44:46

+0

在第二腮红,它缺少一些项目,但它是一个良好的开端。 – 2010-03-03 22:50:20

+0

增加了一个稍微扩展版本的链接。不过,我认为你可以从这个基地实施你的要求。 – AxelEckenberger 2010-03-03 22:58:01