0

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

4

1 に答える 1

3

Generic IComparable(Of ...) を実装すると、自己キャストを保存できます。2 つのオブジェクトが等しい可能性も処理する必要があると思います。

Public Class DemoClass
  Implements IComparable(Of DemoClass)

  Private mstrField1 As String
  Public Property Field1() As String
    Get
      Return mstrField1
    End Get
    Set(ByVal value As String)
      mstrField1 = value
    End Set
  End Property


  Private mstrField2 As String
  Public Property Field2() As String
    Get
      Return mstrField2
    End Get
    Set(ByVal value As String)
      mstrField2 = value
    End Set
  End Property

  Private mstrField3 As String
  Public Property Field3() As String
    Get
      Return mstrField3
    End Get
    Set(ByVal value As String)
      mstrField3 = value
    End Set
  End Property

  ''' <summary>
  ''' Default sort - 1 ASC, 2 ASC, 3 ASC 
  ''' </summary>
  ''' <param name="other"></param>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Public Function CompareTo(ByVal other As DemoClass) As Integer Implements System.IComparable(Of DemoClass).CompareTo
    '-1 = less than other; 0 = same as other; +1 = greater than other'
    Select Case Me.Field1
      Case Is < other.Field1 : Return -1
      Case Is > other.Field1 : Return 1
      Case Else 'equal
        Select Case Me.Field2
          Case Is < other.Field2 : Return -1
          Case Is > other.Field2 : Return 1
          Case Else 'equal
            Select Case Me.Field3
              Case Is < other.Field3 : Return -1
              Case Is > other.Field3 : Return 1
              Case Else : Return 0 'equal
            End Select
        End Select
    End Select
  End Function
End Class
于 2012-06-06T03:20:43.100 に答える