2017-04-03 4 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

すごいです。それは私が思ったよりずっと簡単でした。どちらの例も私の場合に適しています。ありがとうございました!! 最初はフィールド値でソートするためにリフレクションを使用しました - フィールド名を何とか文字列として渡す必要がありました。しかし、このケースでは、関数名の引数ではなく関数の引数を渡すだけでよいことが分かりました。したがって、反射の必要はありません。わーい。 –

関連する問題