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循环有效,我正在寻找一种效率更高但更易于编写和读取的解决方案。