2017-05-12 13 views
0

私は構造のタイプやこれを達成するために何が必要なのかよく分かっていませんが、私はそれがあることを知っています。プロパティを格納するカスタム名を持つVB.NETオブジェクト?

私は物事にこのような何かを参照することができるようにそれを作るしようとしている:

代わりに私が今何をすべきかのracerlist(x).compatibilityArr.john.CleatScore

racerlist(x).compatibilityArr.CleatScoreArr(y).name/.score

をので、本質的に互換性のあるアイテムにアイテムを追加したいのですが、インデックスを使用するのではなく、自分自身の名前として参照できるようになりました。

+0

辞書を使用したり、拡張を作成したりしますか? – Codexer

答えて

0

として、 @Codexerは、私はこれを達成するために辞書を使用して述べた。レーサー(RacerList)の私のリストで

、私は以下に似て作成しRacerCompatibility、している:だから今、私は互換性にアクセスすることができます

Public Class Compatibility 
    Public Cleat As Boolean 
    Public Skill As Integer 
    Public Height As Integer 
End Class 

Public RacerCompatibility As New Dictionary(Of String, Compatibility) 

互換性のように作成されますリスト内のレーサーの名前:

RacerList(x).RacerCompatibility.Item( "John")

0

これは、上記のようにニーズに合ったソリューションを構築する1つの方法です。これは、整数ではなく文字列を受け入れるためにプロパティをオーバーロードするList(Of T)として構築された埋め込みクラスを必要とします。その後

Public Class Foo 
    Public Property compatibilityArr As New Members 
End Class 

Public Class Members : Inherits List(Of Member) 
Public Overloads ReadOnly Property Item(name As String) As Member 
Get 
    Return Me.Where(Function(i) i.Name = name).FirstOrDefault 
End Get 
End Property 
End Class 

Public Class Member 
Public Property Name As String 
Public Property CleatScore As Integer 
End Class 

それを使用する:

Public Class Form1 
    Dim f As New Foo 
    Private Sub loads() Handles Me.Load 
    Dim member As New Member With {.Name = "John", .CleatScore = 10} 
    f.compatibilityArr.Add(member) 
    MessageBox.Show(f.compatibilityArr.Item("John").CleatScore) 
    End Sub 
End Class 
0

あり、これを行うために他の方法がありますが、最も簡単な名前で配列を検索する関数を記述することです:

Sub Main1() 
    Dim racerlist(2) As Racer 
    racerlist(0) = New Racer With {.Name = "Adam", .CleatScore = "1"} 
    racerlist(1) = New Racer With {.Name = "Bill", .CleatScore = "2"} 
    racerlist(2) = New Racer With {.Name = "Charlie", .CleatScore = "3"} 
    For i As Integer = 0 To racerlist.GetUpperBound(0) 
     For j As Integer = 0 To racerlist.GetUpperBound(0) 
     If racerlist(j).Name <> racerlist(i).Name Then 
      ReDim Preserve racerlist(i).CompatibilityArr(racerlist(i).CompatibilityArr.GetUpperBound(0) + 1) 
      racerlist(i).CompatibilityArr(racerlist(i).CompatibilityArr.GetUpperBound(0)) = racerlist(j) 
     End If 
     Next j 
    Next i 
    Dim racerBill As Racer = Racer.FindRacer(racerlist, "Bill") 
    MsgBox(racerBill.FindCompatibility("Charlie").CleatScore) 
    End Sub 

    Class Racer 
    Property Name As String 
    Property CleatScore As String 
    Property CompatibilityArr As Racer() 
    Sub New() 
     ReDim CompatibilityArr(-1) 'initialise the array 
    End Sub 
    Function FindCompatibility(name As String) As Racer 
     Return FindRacer(CompatibilityArr, name) 
    End Function 
    Shared Function FindRacer(racerlist() As Racer, name As String) As Racer 
     For i As Integer = 0 To racerlist.GetUpperBound(0) 
     If racerlist(i).Name = name Then 
      Return racerlist(i) 
     End If 
     Next i 
     Return Nothing 
    End Function 
    End Class 
関連する問題