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

时间:2012-08-29 18:32:01

标签: c# linq pagination

这就是我想要的:

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完成。

2 个答案:

答案 0 :(得分:1)

一些想法。

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

答案 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
   }
}