vb.net - 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"}}
我如何对其进行排序,以便第一项是约翰,因为上次联系日期是最晚的?
谢谢你。
解决方案
您似乎希望按Person
项目的最新Contact_Date
值对项目进行排序。在这种情况下,您需要从每个集合中获取一个Max
值并进行比较:Last_Contact
Person
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)))
请注意,我在比较中颠倒了p1
and的顺序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)
这利用了现有的数组功能,该功能将根据另一个键值数组对一组项目进行排序。此方法涉及开销,因为您要创建数组,然后清除并重新填充集合。因此,它对于小型数据集的效率可能较低,但对于较大的数据集肯定会更有效。
推荐阅读
- javascript - Cheerio 中的选择器
- excel - 如何使用 pandas 读取具有自定义格式的 excel 列?
- javascript - 在 Postgraphile 中,如何更新/删除 JOIN 表?
- javascript - 如何编写一个函数来通过 2 个测试
- python - 使用 Pandas 打印值
- c++ - 禁用“q” Onchar() vtkInteractorStyleSwitch
- python - Python:从 txt 文件中提取浮点数
- java - SonarQube 启动 java.lang.NoClassDefFoundError: PanwHooks
- python - 使用显式执行选项将函数结果存储到磁盘
- c++ - 黑客等级分割错误