.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类型。
  • 我不能检查排序前后的位置…好吧,我可以,但这违背了使用排序函数的想法。然后我可以滚动我自己的排序程序…(除非绝对必要,否则我不想这样做)

如果没有更改,是否可以强制排序不重新排序?

.Sort(Function(x, y) ->当没有东西排序时重新排列列表(即,所有排序字段具有相同的值)

记录如下:

这个实现执行一个不稳定排序;如果是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);