0

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.

4

2 に答える 2

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 に答える
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 に答える