IComparer メソッドの実装に問題があります。基本的に、2 つのカスタム オブジェクトのプロパティを比較したいと考えています (プロパティは整数型です)。
dE は Dictionary(Of String, customObj) です prTabIndex は customObj のプロパティであり、整数型です (これらはすべての例に当てはまります)
さらに検索した後、リストアプローチ、LINQ の利用、C# 3.0 機能の使用という 3 つのことを示唆するこのスレッドを見つけました。ただし、vb であるため、最適なアプローチが何であるかはわかりません。
私は3つの異なる方法を試しました:
...自分の IComparer 実装をローリング:
Public m As Sub(ByRef d As Dictionary(of String, customObj))
Dim sortedD As New SortedDictionary(Of String, customObj)(d, myCompare)
End Sub
Public Class myCompare
Implements IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
If TryCast(x, customObj).prTabIndex < TryCast(y, customObj).prTabIndex Then
Return -1
Else
Return 1
End If
End Function
End Class
...リストの並べ替え (これはうまくいくと思います - このスレッドを少しアカデミックにしています)。
Dim sortedL As List(Of KeyValuePair(Of String, customObj)) = dE.ToList
sortedL.Sort(Function(firstPair As KeyValuePair(Of String, customObj), nextPair As KeyValuePair(Of String, customObj)) firstPair.Value.prTabIndex.CompareTo(nextPair.Value.prTabIndex))
...または、SortedDictionary への変換に直接ラムダ関数を組み込みます。
Dim dESorted = From kvp As KeyValuePair(Of String, customObj) In dE.ToDictionary(Function(first As KeyValuePair(Of String, customObj), second As KeyValuePair(Of String, customObj)) first.Value.prTabIndex.CompareTo(nextPair.Value.prTabIndex))
VS2008 では 'dE.ToDictionary...' (行末まで) に下線が引かれ、マウスをホバーした場所に応じて 2 つのメッセージが表示されることに注意してください。
1) 「拡張メソッド '署名' の型パラメーターのデータ型 'System.Linq.Enumerable で定義された署名として、これらの引数から推論できません。データ型を明示的に指定すると、このエラーが修正される場合があります。 「ToDictionary」にカーソルを合わせます。
2) ネストされた関数は、デリゲート '署名' と同じ署名を持っていません。"ToDictionary" の後にカーソルを置いているときに表示されます。
確かに、ラムダ関数は初めてです。
Q1) 実装ごとにどれくらい離れていますか?
Q2) 計算コストが最も低いのはどれですか? なんで?
Q3) 計算コストが最も高いのはどれですか? なんで?
敬具、
-sf