[英]How to use linq to paginate a SortedList in Ascending or Descending order
This does what I want: 这就是我想要的:
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);
}
However, I don't want to have to reverse the list every time this is called, I could write a for loop that goes through the list backwards and implement the paging myself, but im looking for a simple way to get this done with linq. 但是,我不希望每次调用它时都要反转列表,我可以编写一个for循环,向后遍历列表并自己实现分页,但是我正在寻找一种简单的方法来完成这个。
A couple of ideas. 一些想法。
Reverse the list only once when they change the sorting order. 更改排序顺序时,仅反转列表一次。 Then just call the pagination normally:
然后正常调用分页:
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); }
Keep an ascending and descending list in memory: 在内存中保留升序和降序列表:
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); }
In addition to storing the "sorted" list (calling Reverse
really just creates a backwards iterator, it doesn't re-sort). 除了存储“已排序”列表(调用
Reverse
实际上只是创建一个向后迭代器,它不会重新排序)。 You don't have to use Skip
if you don't want to. 如果你不想,你不必使用
Skip
。
For example, if you are always showing Page 1, then Page 2, then page 3, you can simply use Take
alone: 例如,如果您始终显示第1页,然后是第2页,然后是第3页,则只需使用
Take
alone:
// 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
}
The actual foreach
code could be the same block of code simply executed at different times, eg: 实际的
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.