代码之家  ›  专栏  ›  技术社区  ›  Alastair Pitts

我可以改进这些分页扩展方法吗?

  •  1
  • Alastair Pitts  · 技术社区  · 14 年前

    我对基本分页方法非常满意,您可以同时提供页面大小和页码(如下所示)

        public static IEnumerable<T> Paginate<T>(this IEnumerable<T> source, int pageSize, int pageNumber)
        {
            if (pageSize == 0) throw new ArgumentOutOfRangeException("pageSize");
            if (pageNumber == 0) throw new ArgumentOutOfRangeException("pageNumber");
    
            return source.Skip(pageSize * (pageNumber - 1)).Take(pageSize);
        }
    

    IEnumerable<IEnumerable<T>>

        public static IEnumerable<IEnumerable<T>> Paginate<T>(this IEnumerable<T> source, int pageSize)
        {
            source.ThrowIfNull("source");
            if (pageSize == 0) throw new ArgumentOutOfRangeException("pageSize");
    
            var pageCount = (int)Math.Ceiling(source.Count() / (double)pageSize);
    
            if (pageSize == 1)
                pageCount = source.Count();
    
            for (int i = 1; i <= pageCount; i++)
            {
                yield return source.Paginate(pageSize, i);
            }
        }
    

    似乎有点怀疑必须重复两次(一次用于计数,一次用于收益率回报)。

    有什么明显的方法可以改进这些方法吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Ian Mercer    9 年前

    看看MoreLinq批次:- http://code.google.com/p/morelinq/source/browse/trunk/MoreLinq/Batch.cs?r=84

    具体实施如下:

    public static IEnumerable<IEnumerable<TSource>> Batch<TSource>(
                  this IEnumerable<TSource> source, int size)
    {
      TSource[] bucket = null;
      var count = 0;
    
      foreach (var item in source)
      {
          if (bucket == null)
              bucket = new TSource[size];
    
          bucket[count++] = item;
          if (count != size)
              continue;
    
          yield return bucket;
    
          bucket = null;
          count = 0;
      }
    
      if (bucket != null && count > 0)
          yield return bucket.Take(count);
    }