System.ArgumentException: Au moins un objet doit implémenter IComparable

voix
0

Dans ma MergeCollectionclasse j'ai overide InsertItemméthode pour vérifier cas précis. Cependant quand il vient à la ligne , Items.Any(..il me jette exception comme ci - dessous.

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

Classe de fusion:

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

Certains comparateur:

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

classe 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
Créé 18/12/2018 à 11:06
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Le code demande Items.Max. Pour trouver la valeur maximale, il faut comparer les éléments les uns aux autres.

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

Je suppose que vous voulez un autre critère pour la comparaison.

Créé 18/12/2018 à 16:15
source utilisateur

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