-3

Also haben wir kürzlich eine Anwendung von .NET 1.1 nach .NET 4.0 migriert. Und damit gab es eine Reihe von Kompatibilitätsproblemen, die wir beheben mussten. Einer von ihnen ist, dass ein Codeblock die InvalidOperationException wirft.BinarySearch - Fehler beim Vergleich zweier Elemente im Array

Public Function MyFunction(ByVal Params As myParams, ByVal ParamArray someNumber As Integer()) As myData 

    ... 

    If someNumber.BinarySearch(options, MyEnum.Something) >= 0 Then 
     ... 
    EndIf 

    ... 

EndFunction 

Bevor wir zu .NET4 migrierten, funktionierte das in .NET1 richtig. Basierend auf einigen Threads, die ich gelesen habe, gab es Berichte über dieses Problem, das in .NET4 behoben wurde. Um dies in meiner aktuellen Version zu beheben, muss ich die IComparable-Schnittstelle für alle Elemente des Arrays implementieren.

Wie kann ich das beheben? Ich würde jede Hilfe und Zeiger schätzen. Vielen Dank!

EDIT: Hinzufügen der Verknüpfung zu der BinarySearch-Methode, die wir im Code verwenden. https://msdn.microsoft.com/en-us/library/y15ef976.aspx

+0

Können wir den Code der binären Suche sehen, der die Vergleiche durchführt? – codemonkeyliketab

+0

Es ist eine integrierte Funktion von System.Array. – Smiley

+0

Welcher?Wir brauchen mehr Informationen, um Ihnen zu helfen. – codemonkeyliketab

Antwort

0
  1. Implements IComparableIComparable Interface auf Ihre Klassendefinition hinzufügen. 2. Fügen Sie der Klasse eine Methode für IComparable.CompareTo hinzu. Angelehnt an Msdn:

    Public Class Temperature 
        Implements IComparable 
        ' The temperature value 
        Protected temperatureF As Double 
    
    Public Overloads Function CompareTo(ByVal obj As Object) As Integer _ 
    Implements IComparable.CompareTo 
    
        If obj Is Nothing Then Return 1 
        Dim otherTemperature As Temperature = TryCast(obj, Temperature) 
        If otherTemperature IsNot Nothing Then 
         Return Me.temperatureF.CompareTo(otherTemperature.temperatureF) 
        Else 
         Throw New ArgumentException("Object is not a Temperature") 
        End If 
    End Function 
    
    .... 
    
    End Class 
    

Von groben der Code in der CompareTo Funktion auf Ihrer Klasse abhängt (Sie nicht bieten viel weiter zu gehen). Alle numerischen Typen (z. B. Int32 und Double) implementieren IComparable wie String, Char und DateTime. Benutzerdefinierte Typen sollten auch ihre eigene Implementierung von IComparable bereitstellen, um zu ermöglichen, dass Objektinstanzen geordnet oder sortiert werden. Ich glaube, das könnte die Situation in Ihrem Fall sein. Ich hoffe das hilft.

0

Try this:

... 
    Array.Sort(Of Integer)(someNumber) ' only if someNumber is not previously sorted 
    If Array.BinarySearch(Of Integer)(someNumber, MyEnum.Something) >= 0 Then 
    ... 
    End If 
... 

Diese in allen .NET-Frameworks> 2.0 funktionieren sollte. richtig

0

How do I go about to fixing this?

Sie verwenden es nicht. BinarySearch ist eine gemeinsame/statische Methode und doesnt zeigt in Intellisense bei dem Versuch, es als Instanz-Methode zu verwenden:

enter image description here

Wenn Sie es in irgendeine Weise eingeben, erhalten Sie eine neue Compiler-Warnung: Zugang gemeinsamen Mitglieds ... durch eine Instanz ... wird nicht ausgewertet. MSDN hat nichts für NET 1.1, also weiß ich nicht, ob es sich seitdem geändert hat (zweifelhaft). Korrekte Nutzung:

IndexOf6 = Array.BinarySearch(myIntAry, 6) 

die die Frage, als Teil der Umwandlung von NET 1.x auf 4.5 bitten, warum dies nicht zu List(Of Int32) konvertieren. Ein schneller Test zeigt, dass die IndexOf() Methode 2-3 mal schneller ist:

IndexOf6 = intList.IndexOf(6) 

Die List<T> Methode ist auch mehr ‚Standalone‘, da im Gegensatz zu einem System.Array, braucht sie nicht in Reihenfolge sortiert werden zu arbeiten.