[英]Can I improve these Pagination extension methods?
我剛剛編寫了幾種分頁擴展方法,但我很想知道是否可以進行任何改進。
我對基本的分頁方法非常滿意,您可以在其中提供頁面大小和頁碼(如下所示)
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);
}
}
似乎有點懷疑必須迭代兩次(一次用於計數,一次用於收益率返回)。
有什么明顯的方法可以改善這些方法?
看看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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.