System.ArgumentException: Pelo menos um objeto deve implementar IComparable

votos
0

Na minha MergeCollectionclasse eu tenho overide InsertItemmétodo para verificar se há caso específico. No entanto, quando se trata da linha Items.Any(..isto me lança exceção como abaixo.

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

Mesclar classe:

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

Alguns 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

classe de coleção:

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
Publicado 18/12/2018 em 11:06
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

O código pede Items.Max. Para encontrar o valor Max, tem que comparar os itens ao outro.

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

Eu acho que você quer um critério diferente para a comparação.

Respondeu 18/12/2018 em 16:15
fonte usuário

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