简体   繁体   English

如何使用linq以升序或降序对SortedList进行分页

[英]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. 一些想法。

  1. 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); } 
  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM