Avatar billede MadsHaupt Juniormester
18. december 2013 - 10:50 Der er 5 kommentarer og
1 løsning

list.sort

Jeg prøver at sorter nogle klasser, men der opstår bare fejl.

Fejlmeddelelse:

Failed to compare two elements in the array

System.InvalidOperationException: Failed to compare two elements in the array. ---> System.ArgumentException: At least one object must implement IComparable.
  at System.Collections.Comparer.Compare(Object a, Object b)
  at System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)
  at System.Collections.Generic.ArraySortHelper`1.InsertionSort(T[] keys, Int32 lo, Int32 hi, IComparer`1 comparer)
  at System.Collections.Generic.ArraySortHelper`1.IntroSort(T[] keys, Int32 lo, Int32 hi, Int32 depthLimit, IComparer`1 comparer)
  at System.Collections.Generic.ArraySortHelper`1.IntrospectiveSort(T[] keys, Int32 left, Int32 length, IComparer`1 comparer)
  at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
  --- End of inner exception stack trace ---
  at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
  at System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
  at System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
  at System.Collections.Generic.List`1.Sort()
  at WindowsApplication11.Form1.Form1_Load(Object sender, EventArgs e) in C:\Users\PERSONALE\Desktop\WindowsApplication11\WindowsApplication11\Form1.vb:line 19
  at System.EventHandler.Invoke(Object sender, EventArgs e)
  at System.Windows.Forms.Form.OnLoad(EventArgs e)
  at System.Windows.Forms.Form.OnCreateControl()
  at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
  at System.Windows.Forms.Control.CreateControl()
  at System.Windows.Forms.Control.WmShowWindow(Message& m)
  at System.Windows.Forms.Control.WndProc(Message& m)
  at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
  at System.Windows.Forms.ContainerControl.WndProc(Message& m)
  at System.Windows.Forms.Form.WmShowWindow(Message& m)
  at System.Windows.Forms.Form.WndProc(Message& m)
  at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


Kode:
Public Class Form1

    Public Class str

        Dim str As String

        Public Sub New(ByVal str As String)
            Me.str = str
        End Sub

        Public Overrides Function ToString() As String
            Return str
        End Function

    End Class

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim a As New List(Of str)({New str("a"), New str("y"), New str("b"), New str("b1"), New str(""), New str("")})
        a.Sort()
    End Sub

End Class


Hvad kan der være galt?.
Avatar billede arne_v Ekspert
18. december 2013 - 14:46 #1
System.ArgumentException: At least one object must implement IComparable

og ganske rigtigt:

Public Class str

implementerer ikke IComparable
Avatar billede MadsHaupt Juniormester
18. december 2013 - 16:24 #2
Jeg har fundet ud af det.

Kode:
Public Class Form1

    Public Class str
        Implements IComparable

        Dim str As String

        Public Sub New(ByVal str As String)
            Me.str = str
        End Sub

        Public Overrides Function ToString() As String
            Return str
        End Function

        Public Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo
            If obj Is Nothing Then
                Return 1
            End If
            Dim otherstr As str = TryCast(obj, str)
            If otherstr IsNot Nothing Then
                Return str.CompareTo(otherstr.str)
            Else
                Throw New ArgumentException("Object is not a Temperature")
            End If
        End Function

    End Class

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim a As New List(Of str)({New str("a"), New str("y"), New str("b"), New str("b1"), New str(""), New str("")})
        a.Sort()
    End Sub

End Class


arne_v skriv et svar så får du point.
Avatar billede arne_v Ekspert
19. december 2013 - 02:52 #3
Jeg havde troet at du skulle bruge:

Implements IComparable(Of str)
Avatar billede arne_v Ekspert
19. december 2013 - 02:52 #4
og et svar
Avatar billede MadsHaupt Juniormester
19. december 2013 - 16:09 #5
Man kan både bruge IComparable og IComparable(Of str).
Avatar billede arne_v Ekspert
19. december 2013 - 20:17 #6
Jeg vil anbefale IComparable(Of str).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester