我刚刚写了一些分页扩展方法,我很想知道是否有任何改进。我可以改进这些分页扩展方法吗?
我与底座分页方法,在那里你提供的页面大小和页面数都非常高兴(如下图所示)
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);
}
}
这似乎有点嫌疑人必须为产量回归迭代两次(一次为计数一次。
是否有任何明显的方法可以改进这些方法?
对于你只通过网页遍历产量的回报。有一个foreach的解决方法,但我怀疑它会更快,因为foreach本身比较慢。如果您渴望表现,我宁愿改进分页方法。像Skip()和Take()这样的IEnumerable扩展方法可以手动编写,并且在这种特殊情况下它们的运行速度会更快。 (你必须从X循环到Y索引,而不是从X循环到结束,然后从X循环到Y,如跳过并采取行动) – AlexanderMP 2010-10-27 05:37:04