【问题标题】:Can I improve these Pagination extension methods?我可以改进这些分页扩展方法吗?
【发布时间】:2010-10-27 05:33:16
【问题描述】:

我刚刚编写了几个分页扩展方法,我很想知道是否可以进行任何改进。

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

    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&lt;IEnumerable&lt;T&gt;&gt;

    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);
        }
    }

似乎有点怀疑必须迭代两次(一次用于计数,一次用于收益率返回。

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

【问题讨论】:

  • 对于收益回报,您只需遍历页面即可。有一个 foreach 解决方法,但我怀疑它会更快,因为 foreach 本身更慢。如果您渴望性能,我宁愿改进 Paginate 方法。像 Skip() 和 Take() 这样的 IEnumerable 扩展方法可以手动编写,在这种特殊情况下它们会更快地工作。 (您必须从 X 循环到 Y 索引,而不是从 X 循环到结束,然后从 X 到 Y 循环,就像跳过和采取那样)

标签: c# .net linq


【解决方案1】:

看看 MoreLinq Batch :- 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);
}

【讨论】:

  • 看过这些 Batch 方法后,我真的无法弄清楚它们是如何工作的 O.o 不过感谢您提供的链接,看起来像一个很棒的库!
  • 死链接(这就是为什么只有链接的答案不好)。
猜你喜欢
  • 2011-11-21
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多