私はgeneric method
は、次のコードからArray
を拡張するために取得しようとしています:ジェネリック機能(downvoted)
Public Class clsField
Public idx As String
Public name As String
Public weight As Long
Public Sub New(i As String, n As String, w As Long)
idx = i : name = n : weight = w
End Sub
End Class
Public Class Container
Public fields As clsField() ' filled in by a JSON parser (order matters)
' returns a list sorted by clsField.weight preserving order for elements with same 'weight' value
Public Function getFields() As List(Of KeyValuePair(Of String, clsField))
Dim auxList As List(Of KeyValuePair(Of String, clsField))
If (fields Is Nothing) OrElse (fields.Count < 1) Then Return New List(Of KeyValuePair(Of String, clsField))
' .ToList to transform IEnumerable to the return type
auxList = Array.ConvertAll(fields, New Converter(Of clsField, KeyValuePair(Of String, clsField))(AddressOf FieldToPair)).ToList
Return auxList.OrderBy(Function(x) x.Value.weight).ToList()
End Function
Public Shared Function FieldToPair(fld As clsField) As KeyValuePair(Of String, clsField)
Return New KeyValuePair(Of String, clsField)(fld.idx, fld)
End Function
End Class
私はArray.ConvertAllで使用Converter(Of TInput, TOutput) Delegate、で立ち往生しています、新しいパラメータを受け入れないであろう、私はTInput
で使用する必要がありkey
を指定する関数を渡すことができ提供:
Private Function ClassToPair(Of T)(obj As T, getProperty As Func(Of T, Object)) As KeyValuePair(Of String, T)
Return New KeyValuePair(Of String, T)(getProperty(obj), obj)
End Function
おそらくへの道がありますOverload
Array.ConvertAll
を入力し、次のコードを完成させるシグニチャ(ConvertAll
とAddressOf ClassToPair
については明らかにコンパイルしないでください)を使用して代替Delegate
〜Converter
を作成してください。 )アイデアを反映するためにここに追加:だから
Module ArrayExtension ' custom method for array
' returns a list sorted by clsField.weight preserving order for elements with same 'weight' value
' getKey is used to transform the array into a List (Of KeyValuePair (Of String, T)) -> using the Converter
' getSortProperty is used to change the sorting 'property'
<Extension()>
Public Function toSortedPairedList(Of T)(arr As T(), Optional getKey As Func(Of T, String) = Nothing,
Optional getSortProperty As Func(Of KeyValuePair(Of String, T), Object) = Nothing) _
As List(Of KeyValuePair(Of String, T))
Dim auxList As List(Of KeyValuePair(Of String, T))
If (arr Is Nothing) OrElse (arr.Count < 1) Then Return New List(Of KeyValuePair(Of String, T))
' .ToList to transform IEnumerable to the return type
auxList = Array.ConvertAll(arr, New Converter(Of T, KeyValuePair(Of String, T))(AddressOf ClassToPair)).ToList
Return auxList.OrderBy(getSortProperty).ToList()
End Function
Private Function ClassToPair(Of T)(obj As T, getProperty As Func(Of T, Object)) As KeyValuePair(Of String, T)
Return New KeyValuePair(Of String, T)(getProperty(obj), obj)
End Function
End Module
、コンバータにgetKey
機能を渡す方法はありません...
を最初に例えばその使用量はのようになります。
Public Function getFields() As List(Of KeyValuePair(Of String, clsField))
Dim auxList As List(Of KeyValuePair(Of String, clsField))
If (fields Is Nothing) OrElse (fields.Count < 1) Then Return New List(Of KeyValuePair(Of String, clsField))
Return fields.toSortedPairedList(Function(x) x.idx, Function(y) y.Value.weight)
End Function
これは、含まれているオブジェクト 'T' [...' array()としてT']のプロパティにアクセスする 'Func'' getProperty'を**保存せずに行うことはできません。変換中に 'KeyValuePair'を生成するために' TKey'を使用します。したがって、変換を実装する関数は、 'getProperty'を最初に**アクセス可能な**変数に格納し、' ClassToPair'から呼び出します。つまり、これは2回実装する必要があります:** 1。**ストア 'getProperty'、** 2。**' Array.ConvertAll' ... – rellampec