1

我有一个类 Player,它有 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

但我不知道这是不是一个东西,它有名字吗?甚至可能吗?

4

2 回答 2

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)
于 2013-08-20T22:29:43.823 回答
0

您可以使用.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))

于 2013-08-21T09:08:18.717 回答