根据对象的属性之一在列表中查找索引

时间:2018-08-02 09:59:04

标签: .net vb.net list indexing find

我目前拥有的是带有一组属性的对象列表。例如:

    Dim children As List(Of Child) = New List(Of Child)
    Dim child As Child = New Child

    child.FaveColor = "Blue"
    child.Pet = "Dog"
    child.SchoolID = "01893A"

    children.Add(child)

稍后,我希望能够基于例如此孩子的唯一学校ID号在我的列表中搜索所述对象的索引。我正在看FindIndexIndexOf,但是我看过的所有示例都涉及根据对象的值而不是其属性之一来搜索列表。感觉应该很简单,但是我遇到了很多麻烦,因此不胜感激。

1 个答案:

答案 0 :(得分:2)

FindIndex是您想要的。您为此提供了一个Predicate(Of T)委托,因此您可以使用任何喜欢的条件,例如

Dim dogOwnerIndex = children.FindIndex(Function(child) child.Pet = "Dog")

如果您不了解lambda表达式,则可以使用命名方法:

Private Function ChildIsDogOwner(child As Child) As Boolean
    Return child.Pet = "Dog"
End Function

并为此创建一个委托:

Dim dogOwnerIndex = children.FindIndex(AddressOf ChildIsDogOwner)

Predicate(Of T)只是采用T实例的方法的委托({TList相同,因此Child在您的情况)并返回BooleanFindIndex基本上遍历List中的项目,并将每个项目传递给指定的方法,并返回该方法返回True的第一个项目的索引。

就像我说的那样,您可以在谓词中使用任何您喜欢的条件,例如

Dim blueLovingDogOwnerIndex = children.FindIndex(Function(child) child.Pet = "Dog" AndAlso
                                                                 child.FaveColor = "Blue")

请注意,如果您要进行临时搜索,即仅使用这些条件一次,那么我建议您使用lambda。如果您打算在多个地方进行相同的搜索,建议您只编写一次该方法,然后在多个地方使用它。当然,您也可以编写一次lambda,例如

Private childIsDogOwner As Predicate(Of Child) = Function(child) child.Pet = "Dog"

,然后在需要适当的委托的任何地方使用childIsDogOwner

Dim dogOwnerIndex = children.FindIndex(childIsDogOwner)