2017-03-15 7 views
0

さて、これはおそらく単純な/愚かな質問ですが、助けに感謝します。今リスト内のオブジェクトを検索する(Of ...)名前で

、私は行くことによって、リストにクラスを追加している:

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'を持っている場合は動作しません。

これは私がこれを行う方法ではないという強い感触を得ています。

ありがとうございました!

+0

辞書に入れて...同じ名前の場合は、どういう意味ですか?追加するオブジェクトごとにキーが必要ですので、探している相手を見つけることができます。 – Codexer

+0

リストの代わりに、[Dictionary](https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx)を使用してみてください。 –

答えて

1

私は、最も簡単なのだと思いますShared機能を0123に追加するクラス。 (あなたは、内蔵のList(Of).Find方法をサポートするためにPredicateを使用することができますが、それはより複雑である)あなたはLINQを使用することができ

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 
1

繰り返し処理でアクセスできます。あなたがループするための簡単な使用して機能

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 
1

として特定の名前、その後

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 

をしたい場合:

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

EDIT

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

...

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

マッチはゼロ以上のレーサーが含まれています指定した名前

このような式に追加のプロパティを追加すると、より具体的な情報を得ることができます。私はZagglerに同意

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

、あなたはそれぞれのレーサーが一意であることを確認するために、特定の特性、またはキーを追加することを検討することをお勧めします。

また、どのリスト名にも「配列」をドロップすることをお勧めします。 「レーサー」は、それを意味するよりも、知るには十分であろう。