2013-08-20 37 views
1

我有一個類,播放器,它有6個左右的屬性,所有整數。對於我的項目,需要進行一些排序,我希望能夠編寫一個接受玩家列表和屬性的函數,通過返回按已傳遞屬性排序的玩家列表進行排序:你如何通過一個屬性作爲參數

Class Player 
    Public Property PID 
    Public Property RunsScored 
    PublicProperty BallsFaced 
End Class 

Class AnotherClass 
    Public Shared PlayerList As New List(Of Player) 

    Public Player sort(list As List(Of Player), prop As Property) 
     'sort the list by prop 
     Return sorted list 
    End Function 

但我不知道這是不是一個東西,它有一個名字?它甚至有可能嗎?

回答

2

做到這一點的最好辦法是採取委託其返回每個對象的屬性集合中

Public Player sort(list As List(Of Player), func As Func(Of Player, Object)) 
    'sort the list by prop 
    Return sorted list 
End Function 

然後你可以使用lambda在調用點指定要使用屬性

sort(list, Function(player) player.PID) 
+0

這聽起來不錯,但我真的不明白你的意思,有沒有像這樣做的一切,所以我可以研究它的名字叫什麼? –

+2

@ user1091236如果你想研究它尋找術語「lambda表達式」。這裏是一個很好的網站http://msdn.microsoft.com/en-us/library/bb531253.aspx – JaredPar

+0

謝謝,我會看看。我只見過拉姆達作爲波長波長的標誌! –

0

您可以使用Reflection in the .NET Framework完成任務。

首先,排序功能(包括如何獲得價值的示例,排序是您的業務)。

Public Sub SortPlayer(list As List(Of Player), prop As Reflection.PropertyInfo) 
    ... 
    Dim value = prop.GetValue(list(1), Nothing) 
    ... 
End Sub 

現在怎麼稱呼它:

Public Sub CallSort() 
    Dim MyList As New Generic.List(Of Player) 
    ... 
    SortPlayer(MyList, GetType(Player).GetProperty("RunsScored")) 
End Sub 

的問題是,由字符串名稱屬性可以在運行時產生問題。所以一個功能是必要的。

Public Sub CallSort2() 
    Dim MyList As New Generic.List(Of Player) 
    SortPlayer(MyList, GetType(Player).GetProperty(GetPropertyName(Function() MyList(0).PID))) 
End Sub 

GetPropertyName可以找到例如,在NotifyOfPropertyChange(() => Name)

注意

JaredPar的解決方案可能是更好的,但是這是一個問題的答案。

我建議你要注意List(Of T).Sort Method (Comparison(Of T))

+0

啊我看了一下那個方法,但是這是一個大學項目,你需要證明你實際上可以爲自己做一個排序。 –

相關問題