我正在创建一个FindPerson方法,该方法在对象列表中搜索给定名称,并在找到该名称的对象列表中返回索引(如果找到),否则返回-1。
Public Class TPerson
Private Name As String
Private Address As String
Private Age As Integer
Public Sub New()
Name = "x"
Address = "x"
Age = 0
End Sub
……
End Class
Public Class TGroup
Private Group As List(Of TPerson)
Private GroupSize As Integer
Public Sub New(size As Integer)
GroupSize = size
Group = New List(Of TPerson)
End Sub
Public Sub FindPerson(findname As String)
Dim index As Integer
index = Group.FindIndex(findname) 'error
End Sub
End Class
输出应该是列表中的索引,但是当我运行程序时出现错误:BC30311类型'String'的值不能转换为'Predicate(Of TPerson)'
我不太确定如何解决此问题,将不胜感激
答案 0 :(得分:0)
您如何期望FindIndex
方法知道如何处理传入的String
?您似乎假设它会知道它代表一个名称,并且需要通过Name
属性来匹配某个项目,但是您认为它将如何做到这一点?您为什么认为它会在Name
而不是Address
上匹配?
如错误消息所述,您需要提供一个Predicate
,它是一个委托,它接受类型为T
的对象并返回一个Boolean
。在您的情况下,T
是TPerson
,Boolean
需要指出findname
是否与其Name
属性相匹配。最简单的方法是使用Lambda表达式:
Dim index = Group.FindIndex(Function(person) person.Name = findname)
如果愿意的话,可以使用命名方法和委托来完成,但这会花费很多时间,这意味着以某种复杂的方式获取findname
值。如果您阅读了FindIndex
方法的文档(应该在此处发布之前完成),您可以找到此类示例。