首页 > 解决方案 > List(Of T) 按 T 属性排序

问题描述

无法绕开这个问题,但这是场景

2 简单示例类:

Public Class Person
Public Name As String
Public Age as Integer
Public Last_Contact As New List(Of ContactInfo)
End Class

Public Class ContactInfo
Public Contact_Date As Date
Public Convo as String
End Class

在子:

Dim myPersonList as New List(Of Person)

现在我知道通过简单地执行以下操作按名字和年龄对 myPersonList 进行排序:

myPersonList.Sort(Function (x,y) x.name.CompareTo(y.name))

如何按已排序列表的 Last_Contact.ContactDate 的顺序对 myPerson 列表进行排序

所以基本上说在 myPersonList 我有

{Dave, 32, {02/22/2021, "Sample Convo"}, {01/12/2021 "Sample Convo"}}, John, 34 {04/08/2020, "sample convo"}}

我如何对其进行排序,以便第一项是约翰,因为上次联系日期是最晚的?

谢谢你。

标签: vb.netlistsorting

解决方案


您似乎希望按Person项目的最新Contact_Date值对项目进行排序。在这种情况下,您需要从每个集合中获取一个Max值并进行比较:Last_ContactPerson

Dim people As New List(Of Person)

'...

people.Sort(Function(p1, p2) p2.Last_Contact.Max(Function(ci) ci.Contact_Date).CompareTo(p1.Last_Contact.Max(Function(ci) ci.Contact_Date)))

请注意,我在比较中颠倒了p1and的顺序p2。那是因为默认的排序顺序是升序,所以如果你想降序,你需要在比较时反转项目的顺序。

值得注意的是,Last_Contact每次进行比较时,此代码都会枚举这两个项目的集合。如果数据量很小,那没什么大不了的,但是如果有很多数据,那么这可能会使整个过程花费大量时间。这是一个更详细的替代方案,可以为大型数据集节省时间:

Dim people As New List(Of Person)

'...

Dim items = people.ToArray()
Dim keys = Array.ConvertAll(items, Function(p) p.Last_Contact.Max(Function(ci) ci.Contact_Date))

Array.Sort(keys, items)

people.Clear()
people.AddRange(items)

这利用了现有的数组功能,该功能将根据另一个键值数组对一组项目进行排序。此方法涉及开销,因为您要创建数组,然后清除并重新填充集合。因此,它对于小型数据集的效率可能较低,但对于较大的数据集肯定会更有效。


推荐阅读