System.ArgumentException:至少一个对象必须实现IComparable

时间:2018-12-18 11:06:40

标签: vb.net

在我的MergeCollection类中,我有overide InsertItem方法来检查特定情况。然而,当涉及到Items.Any(..行时,它引发了如下异常。

System.ArgumentException: 'At least one object must implement IComparable.'

合并类:

Public Class Merge
        Property Min As Integer
        Property Max As Integer?
        Property Value As Double

        Public Sub New(min As Integer, max As Integer?, value As Integer)
            Me.Min = min
            Me.Max = max
            Me.Value = value
        End Sub
End Class

Public Enum SortCriteria
        MinThenMax
        MaxThenMin
End Enum

一些比较器:

Public Class MergeComparer
        Implements IComparer(Of Merge)  

        Public SortBy As SortCriteria = SortCriteria.MinThenMax

        Public Function Compare(x As Merge, y As Merge) As Integer Implements IComparer(Of Merge).Compare
           'to be implemented
        End Function
End Class

集合类:

Public Class MergeCollection
          Inherits Collection(Of Merge)

        Public SortBy As SortCriteria = SortCriteria.MinThenMax

        Protected Overrides Sub InsertItem(index As Integer, item As Merge)
            if IsNothing(item.Max)
                If Items.Any(Function(myObject) IsNothing(Items.Max)) Then
                    Return
                End If
            End If
            MyBase.InsertItem(index, item)
        End Sub   

        Public Sub Sort()
            Dim allItems = Items.ToArray()

            Array.Sort(allItems)

            For i = 0 To allItems.GetUpperBound(0)
                Items(i) = allItems(i)
            Next
        End Sub

        Public Sub Sort(comparison As Comparison(Of Merge))
            Dim allItems = Items.ToArray()

            Array.Sort(allItems, comparison)

            For i = 0 To allItems.GetUpperBound(0)
                Items(i) = allItems(i)
            Next
        End Sub

        Public Sub Sort(comparer As IComparer(Of Merge))
            Dim allItems = Items.ToArray()

            Array.Sort(allItems, comparer)

            For i = 0 To allItems.GetUpperBound(0)
                Items(i) = allItems(i)
            Next
        End Sub

End Class

1 个答案:

答案 0 :(得分:0)

代码要求输入Items.Max。要找到最大值,它必须将各项相互比较。

Public Class Merge
    Implements IComparable(Of Merge)

    Property Min As Integer
    Property Max As Integer?
    Property Value As Double

    Public Sub New()
        ' empty constructor
    End Sub

    Public Sub New(min As Integer, max As Integer?, value As Integer)
        Me.Min = min
        Me.Max = max
        Me.Value = value
    End Sub

    Public Overloads Function CompareTo(other As Merge) As Integer Implements IComparable(Of Merge).CompareTo

        If other Is Nothing Then Return 1

        ' Could use
        ' Return (Me.Value).CompareTo(other.Value)
        ' instead of the following code...
        If Me.Value > other.Value Then Return 1
        If Me.Value = other.Value Then Return 0

        Return -1

    End Function

End Class

我想您需要一个不同的比较标准。