Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用linq按升序或降序对SortedList进行分页_C#_Linq_Pagination - Fatal编程技术网

C# 如何使用linq按升序或降序对SortedList进行分页

C# 如何使用linq按升序或降序对SortedList进行分页,c#,linq,pagination,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);

这正是我想要的:

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完成此操作。

有几个想法

  • 当他们更改排序顺序时,仅反转列表一次。然后正常调用分页:

    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);
    }
    
    SortOrder oldOrder=SortOrder.升序;
    作废集合订单(排序器新订单)
    {
    如果(旧订单!=新订单)
    {
    list.Values=list.Values.Reverse().ToList();
    旧订单=新订单;
    }
    }
    IEnumerable GetPage(整数页索引、整数页、排序顺序)
    {
    设置订单(订单);
    返回列表.Values.Skip(pageIndex*NumberPage).Take(NumberPage);
    }
    
  • 在内存中保留升序和降序列表:

    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);
    }
    
    列表上升列表,下降列表;
    void setlist()
    {
    ascendingList=list.Values;
    下降列表=list.Values.Reverse().ToList();
    }
    IEnumerable GetPage(整数页索引、整数页、排序顺序)
    {
    return(order==SortOrder.Ascending?ascendingList:decendinglist).Skip(pageIndex*numberpage).Take(numberpage);
    }
    

  • 除了存储“排序”列表(调用
    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
       }
    }
    
    IEnumerable GetCurrentPage()
    {
    returnorderedumerator.Take(页面大小);
    }
    public void nextPageButton_单击(对象发送者,事件参数e)
    {
    foreach(GetCurrentPage()中的变量e)
    {
    //当前页面中的元素
    }
    }
    
    我认为您需要显示list和list.Values的声明/数据类型。列表很简单:SortedList list;这假设他们正在按顺序移动页面,但是是的。我怀疑Reverse()会创建一个向后迭代器,感谢您提供的这些信息,这正是我所需要的。更多信息可以在以下网址找到:与OrderBy不同,这种排序方法在确定顺序时不考虑实际值本身。相反,它只是以底层源代码生成元素的相反顺序返回元素。“这两种解决方案都不如for循环有效,我正在寻找一种效率更高但更易于编写和读取的解决方案。