2017-05-12 114 views
0

我不熟悉結構的類型或任何我需要用來實現這一點,但我知道有一個。用自定義名稱存儲屬性的VB.NET對象?

我試圖讓這個我可以參考的東西是這樣的:

racerlist(x).compatibilityArr.john.CleatScore

什麼,而不是我現在要做的:

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

所以基本上,我想將項目添加到compatibilityarr(可能必須更改爲一個很好的列表),並且能夠將racer引用爲自己的名稱,而不是使用索引。

+0

也許使用字典或創建一個擴展? – Codexer

回答

0

由於@Codexer提到,我用字典來實現這一點。

在我的賽車(RacerList)的名單,我有RacerCompatibility,我創建了類似於下面:

Public RacerCompatibility As New Dictionary(Of String, Compatibility) 

兼容性就像創建:

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

所以,現在我可以訪問的兼容性名單內的賽車手如:

RacerList(x).RacerCompatibility.Item(「John」)

0

這是一種構建符合您上述需求的解決方案的方法。它需要嵌入類,該嵌入類構建爲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