System.ArgumentException: Przynajmniej jeden obiekt musi zaimplementować IComparable

głosy
0

W mojej MergeCollectionklasie mam overide InsertItemmetodę sprawdzenia konkretnego przypadku. Niemniej jednak, jeśli chodzi o linię Items.Any(..rzuca mi wyjątek jak poniżej.

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

Scalanie klasę:

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

Niektóre comparer:

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

Klasa Collection:

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
Utwórz 18/12/2018 o 11:06
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Kod prosi Items.Max. Aby znaleźć wartość Max, musi porównać elementy do siebie.

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

Chyba, że ​​chcesz innego kryterium porównania.

Odpowiedział 18/12/2018 o 16:15
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more