繁体   English   中英

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

[英]How to use linq to paginate a SortedList in Ascending or Descending order

这就是我想要的:

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循环,向后遍历列表并自己实现分页,但是我正在寻找一种简单的方法来完成这个。

一些想法。

  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); } 
  2. 在内存中保留升序降序列表:

     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); } 

除了存储“已排序”列表(调用Reverse实际上只是创建一个向后迭代器,它不会重新排序)。 如果你不想,你不必使用Skip

例如,如果您始终显示第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
}

实际的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