0

这就是我想要的:

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 .

4

2 回答 2

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);
    }
    
于 2012-08-29T18:38:42.120 回答
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
   }
}
于 2012-08-29T18:45:30.523 回答