.Sort(Function(x, y) ->当没有东西排序时重新排列列表(即,所有排序字段具有相同的值)
本文关键字:排序 列表 排列 字段 新排列 Function Sort | 更新日期: 2023-09-27 18:14:14
我使用的是:
mybookings.listOfBookings.Sort(Function(x, y) x.checkIn.Date.CompareTo(y.checkIn.Date)
现在,这工作得很好,但是我遇到了一种情况,在我的其余代码中引入了一个错误。
当我有一个像上面这样的对象列表,并且两个对象的checkIn
具有相同的date
值时,排序将重新排列列表…我希望它保持原样,因为没有什么要排序的…
当它交换列表时,它会在我的代码中引入一些问题,这些问题希望列表保持原样。是的,有人会说我需要解决这个问题……但是在这种情况下,还有许多其他因素期望列表中的第一次出现是实际的第一次出现(基于对象的其他属性)。
简而言之,对象在软件的其他地方从最早(checkIn)到最近(checkIn)得到"支付"。这里发生的事情是,现在在列表的位置1有一个"未支付"对象,例如,当它本来应该在位置2时,
- 列表可以包含任意数量的对象
- 列表通常有多个对象,它根据不同的Date值正确排序
- 排序的字段,是
date
类型。 - 我不能检查排序前后的位置…好吧,我可以,但这违背了使用排序函数的想法。然后我可以滚动我自己的排序程序…(除非绝对必要,否则我不想这样做)
如果没有更改,是否可以强制排序不重新排序?
记录如下:
这个实现执行一个不稳定排序;如果是2,则为元素相等时,它们的顺序可能不保留。相比之下,稳定排序保留相等元素的顺序。
你可以先检查是否都是相同的:
Dim first As Date = mybookings.listOfBookings.First().checkIn.Date
Dim allSameDate As Boolean = mybookings.listOfBookings.Skip(1).
All(Function(x) x.checkIn.Date = first)
If Not allSameDate Then
' now you can sort '
mybookings.listOfBookings.Sort(Function(x, y) x.checkIn.Date.CompareTo(y.checkIn.Date)
End If
另一种方法是使用LINQ创建一个新的List(Of T)
, Enumerable.OrderBy
是稳定的:
这个方法执行稳定排序;也就是说,如果两个键元素相等,元素的顺序保持
停止使用List.Sort
,改为使用Enumerable.OrderBy
。与前者相比,后者实现了稳定的排序:
这个方法执行稳定排序;也就是说,如果两个键元素是相等的,元素的顺序保持不变。在相反,不稳定排序不保留元素的顺序有相同的键
我不熟悉VB。但是在c#中,你会把它写成
var sorted = mybookings.listOfBookings.OrderBy(b => b.checkIn.Date);