2017-04-03 82 views
1

我想按列表项中包含的函数的结果对列表进行排序。怎么会这样做呢?按函数结果排序列表

这里是一个例子。比方说,我有以下对象:

Public Class MyListObject 
    Public MyText1 As String 
    Public MyText2 As String 

    Public Function AddSuffix(ByVal MySuffix As String) As String 
     Return Mytext1 & MySuffix 
    End Function 

End Class 

(大型过于简单的例子的缘故)

之后,我有这些对象的列表:

Dim ResultList As New List(Of MyListObject) 

现在,例如,按字段MyText1值排序列表,我用这个:

ResultList = ResultList.OrderBy(Function(x) GetType(MyListObject).GetField("MyText1").GetValue(x)).ToList 

(使用d反射,所以我可以将字段名称作为字符串传递)

如何通过功能AddSuffix结果对此列表进行排序并同时传递参数MySuffix

我想这将是这个样子,但显然这是行不通

ResultList = ResultList.OrderBy(Function(x) GetType(MyListObject).GetField("AddSuffix(""_myCustomSuffix"")").GetValue(x)).ToList 

PS。我意识到,在这个例子中,这个函数几乎没有意义。实际代码要复杂得多,而且函数会为每个列表项返回不同的可排序数据。

回答

1

我猜你有一个很好的理由来使用反射,但我会建议避免它,即使你有太多的领域和方法。

ResultList = ResultList.OrderBy(Function(o) o.AddSuffix("_myCustomSuffix")).ToList 

按名称调用一个方法的VB的方式是这样的(也未测试)

ResultList = ResultList.OrderBy(Function(o) CallByName(o, 
         "AddSuffix", CallType.Method, "_myCustomSuffix")).ToList 
+0

哇。这比我想象的要容易得多。这两个例子都适用于我的案例。谢谢!! 最初我使用反射来按字段值进行排序 - 我需要以某种方式将字段名称作为字符串传递。但对于这种情况,我只是想通了,我只需要传递函数的参数,而不是函数名称它自己。因此不需要反思。好极了。 –