vb.net - 在下面的代码片段中使用列表时,AddressOf 运算符如何在 VB.net 中工作
问题描述
Private Sub btnByPrice_Click(sender As Object, e As EventArgs) Handles btnByPrice.Click
stockList.Sort(AddressOf CompareByPrice)
stockList.Sort()
DisplayList()
End Sub
Private Function CompareByPrice(x As Stock, y As Stock) As Integer
If chkDescending.Checked Then
Return y.Price.CompareTo(x.Price)
End If
Return x.Price.CompareTo(y.Price)
End Function
解决方案
AddressOf
操作员创建一个委托,它是一个引用方法的对象。这允许您像传递任何其他对象一样传递一个方法,并在您喜欢的任何地方调用它,即使在没有直接引用该方法所属的对象的地方也是如此。
该List(Of T).Sort
方法接受具有两个类型参数的方法的委托,T
并返回一个Integer
以指示它们的相对大小。任何小于零的结果都被解释为第一个对象小于第二个对象,任何大于零的结果被解释为第一个对象大于第二个对象,零的结果被解释为两个对象相等。
排序几乎总是通过一次比较两个项目并在必要时重新排列它们来完成,然后根据需要一遍又一遍地重复,直到项目有序为止。选择项目进行比较和重新排列的方式将根据算法而改变,但比较和重新排列步骤仍然存在。
每次该Sort
方法需要比较列表中的两个项目时,它都会调用您提供的委托并将这两个项目作为参数传入,然后使用结果来决定是否重新排列这些项目。这样,您可以以任何您想要的方式对任何类型的项目进行排序,而无需编写自己的排序例程。列表本身已经知道如何排序,您只需提供特定的比较代码,列表就会使用它,而不必关心它的实际来源。
推荐阅读
- android - Android中服务和活动之间的交互
- xml - “找不到元素的声明”使用 XSD 进行验证
- spring - Spring Boot 应用程序未启动,也不例外
- javascript - Javascript - 如何在方法中获取/设置?(例如菠萝.is_a.fruit)
- javascript - React SPA with Express Backend API - 将 JWT 存储在本地存储中并限制 API 仅访问 SPA 的 Web 服务器 IP
- reactjs - 使用 react 路由器和 react-swipeable -views 在标签更改时更改 url
- oop - 除了 Animals 和 Shapes 之外,还有什么动态多态性的真实用例?
- java - Scala中的Java反射,将参数传递给函数时出错
- c++ - 代码块主页不会加载?
- c++ - c++ getline() 似乎没有正确运行,直到最后才读取该行