【问题标题】:Finding object in a List(Of ...) by Name按名称在 List(Of ...) 中查找对象
【发布时间】:2017-08-05 16:20:08
【问题描述】:

好的,所以这可能是一个简单/愚蠢的问题,但非常感谢您的帮助。

现在,我正在通过以下方式将课程添加到列表中:

    Public RacersArray As New List(Of Racer)
    ...
    Dim tempRacer As New Racer()
    With tempRacer                 'create data that is to be 'add' or 'edit'
        .Name = InpName.Text
        .CleatSize = InpCleatSize.Text
        .SkillLevel = InpSkillLevel.Text
        .Height = InpHeight.Text
        .Team = InpPreferredTeam.Text
    End With
    RacersArray.Add(tempRacer)

我正在尝试通过执行以下操作来引用此列表中的项目:

RacersArray.IndexOf(<Name>)

但显然,如果他们都有相同的项目名称“tempRacer”,这将不起作用。

我有一种强烈的感觉,我不应该这样做。

感谢您的帮助!!

【问题讨论】:

  • 把它们放在字典里......另外,如果它们都有相同的名字,它们有什么区别?您添加的每个对象都需要一个密钥,这样您就可以找到您正在寻找的任何人。
  • 尝试使用Dictionary代替列表

标签: vb.net list class


【解决方案1】:

您可以通过迭代访问它们。

For Each r As Racer In RacersArray
   'Access properties here..
    MessageBox(r.SkillLevel & " " & r.Team)
Next r

编辑:如果你想要一个特定的名字,那么

For Each r As Racer In RacersArray
    If r.Name = "Desired Name" Then
       'Access properties here..
        MessageBox(r.SkillLevel & " " & r.Team)
        Exit For
    End If
Next r

作为一个函数

Private Function GetRacer(Byval RacersArray As List(Of Racer), Byval Name As String) As Racer
    Dim racerInfo As Racer
    For Each r As Racer In RacersArray
        If r.Name = Name Then
            racerInfo = r
            Exit For
        End If
    Next r
    Return racerInfo
End Function

【讨论】:

    【解决方案2】:

    使用简单的for循环:

    for i as integer =0 to RacersArray.Count -1
        'use RacersArray(i) to access item
    next
    

    【讨论】:

      【解决方案3】:

      我认为最简单的方法是在Racer 类中添加一个Shared 函数。 (您可以使用Predicate 来支持内置的List(Of ).Find 方法,但更复杂)

      Sub Demo()
        Dim RacersArray As New List(Of Racer)
        RacersArray.Add(New Racer With {.Name = "Alpha", .CleatSize = "1", .SkillLevel = "Novice", .Height = "180", .Team = "Bananas"})
        RacersArray.Add(New Racer With {.Name = "Beta", .CleatSize = "2", .SkillLevel = "Journeyman", .Height = "160", .Team = "Apples"})
        RacersArray.Add(New Racer With {.Name = "Gamma", .CleatSize = "3", .SkillLevel = "Expert", .Height = "200", .Team = "Apples"})
        RacersArray.Add(New Racer With {.Name = "Delta", .CleatSize = "4", .SkillLevel = "Expert", .Height = "1950", .Team = "Bananas"})   
        Dim rcrFind As Racer = Racer.FindName(RacersArray, "Beta")
        If rcrFind Is Nothing Then
          MsgBox("Not found")
        Else
          MsgBox(rcrFind.Team)
        End If
      End Sub
      
      Class Racer
        Public Property Name As String
        Public Property CleatSize As String
        Public Property SkillLevel As String
        Public Property Height As String
        Public Property Team As String
      
        Public Shared Function FindName(l As List(Of Racer), name As String) As Racer
          For Each r As Racer In l
            If r.Name = name Then Return r
          Next r
          Return Nothing
        End Function
      End Class
      

      【讨论】:

        【解决方案4】:

        你可以使用 LINQ...

        Matches = (From r In RacersArray Where r.Name = "{name you're looking for}")
        

        比赛将包含零个或多个具有您指定名称的赛车手。

        您可以通过像这样向表达式添加其他属性来获得更具体的信息。

        Matches = (From r In RacersArray Where r.Name = "Some Name" And r.Team = "Some Team")
        

        我同意 Zaggler 的观点,您可能需要考虑添加一个识别属性或密钥,以确保每个 Racer 都是独一无二的。

        另外,我建议您在任何列表名称中删除“Array”。 “赛车手”足以知道比它所暗示的更多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-16
          • 1970-01-01
          • 1970-01-01
          • 2015-11-16
          • 2021-09-24
          • 2012-05-26
          • 2019-08-17
          相关资源
          最近更新 更多