Vb.net 在将字典转换为SortedDictionary后实现自定义对象的iComparer

Vb.net 在将字典转换为SortedDictionary后实现自定义对象的iComparer,vb.net,icomparer,sorteddictionary,Vb.net,Icomparer,Sorteddictionary,我在实现IComparer方法时遇到问题。 本质上,我想比较两个自定义对象的属性—属性类型为integer dE是字符串的字典,customObj prTabIndex是customObj的一个属性,类型为Integer 这些都适用于所有例子 在进一步搜索之后,我找到了一个线程,它建议了三件事:列表方法、利用LINQ和一些C3.0特性。然而,在vb中,不确定他们最好的方法是什么 我尝试了三种不同的方法: …滚动我自己的IComparer实现: Public m As Sub(ByRef d As

我在实现IComparer方法时遇到问题。 本质上,我想比较两个自定义对象的属性—属性类型为integer

dE是字符串的字典,customObj prTabIndex是customObj的一个属性,类型为Integer 这些都适用于所有例子

在进一步搜索之后,我找到了一个线程,它建议了三件事:列表方法、利用LINQ和一些C3.0特性。然而,在vb中,不确定他们最好的方法是什么

我尝试了三种不同的方法:

…滚动我自己的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
…或将lambda函数直接合并到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…”,并根据鼠标悬停的位置给出了两条消息:

1无法从这些参数推断扩展方法“signature”中类型参数的数据类型为“System.Linq.Enumerable中定义的签名”。显式指定数据类型可能会更正此错误。在ToDictionary上空悬停时看到

2嵌套函数没有与委托“签名”相同的签名。在ToDictionary之后悬停在任何物体上时看到

诚然,我不熟悉lambda函数

Q1在每个实现中我离目标有多远

Q2哪一个计算成本最低?为什么?

Q3哪一个是计算上最昂贵的?为什么?

亲切问候,


-sf

如果您实现了通用的IComparableOf…,则可以保存您的自投。。。。我认为你也应该处理两个物体相等的可能性

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

如果您实现了通用的IComparableOf…,则可以保存您的自转换。。。。我认为你也应该处理两个物体相等的可能性

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

忘记:然后将DemoClass对象添加到DemoClass的列表中,然后使用ListOf的.Sort函数…忘记:然后将DemoClass对象添加到DemoClass的列表中,然后使用ListOf的.Sort函数。。。