这就是我想要的:
if (order == SortOrder.Ascending) {
return list.Values.Skip(pageIndex * numberPerPage).Take(numberPerPage);
} else if (order == SortOrder.Descending) {
return list.Values.Reverse().Skip(pageIndex * numberPerPage).Take(numberPerPage);
}
但是,我不希望每次调用它时都要反转列表,我可以编写一个for循环,向后遍历列表并自己实现分页,但我正在寻找一种简单的方法来获取这个用linq完成。
答案 0 :(得分:1)
一些想法。
更改排序顺序时,只反转一次列表。然后通常只是调用分页:
SortOrder oldOrder = SortOrder.Ascending;
void SetSortOrder(SortOrder newOrder)
{
if(oldOrder != newOrder)
{
list.Values = list.Values.Reverse().ToList();
oldOrder = newOrder;
}
}
IEnumerable<Stuff> GetPage(int pageIndex, int numberPerPage, SortOrder order)
{
SetSortOrder(order);
return list.Values.Skip(pageIndex * numberPerPage).Take(numberPerPage);
}
在内存中保留升序和降序列表:
List<Stuff> ascendingList, descendingList;
void SetLists()
{
ascendingList = list.Values;
descendingList = list.Values.Reverse().ToList();
}
IEnumerable<Stuff> GetPage(int pageIndex, int numberPerPage, SortOrder order)
{
return (order == SortOrder.Ascending ? ascendingList : descendingList).Skip(pageIndex * numberPerPage).Take(numberPerPage);
}
答案 1 :(得分:1)
除了存储“已排序”列表(调用Reverse
之外,实际上只创建一个向后迭代器,它不会重新排序)。如果您不想,则不必使用Skip
。
例如,如果您始终显示第1页,然后是第2页,然后是第3页,则只需单独使用Take
:
// done when user clicks something to change `order`
orderedEnumerator = order == SortOrder.Ascending ? list : list.Reverse();
//...
foreach(var e in orderedEnumerator.Take(pageSize)
{
// show first page
}
foreach(var e in orderedEnumerator.Take(pageSize)
{
// show second page
}
foreach(var e in orderedEnumerator.Take(pageSize)
{
// show third page
}
实际的foreach
代码可能是在不同时间执行的相同代码块,例如:
IEnumerable<MyType> GetCurrentPage()
{
return orderedEnumerator.Take(pageSize);
}
public void nextPageButton_Click(object sender, EventArgs e)
{
foreach(var e in GetCurrentPage())
{
// elements in current page
}
}