-3

最近、.NET 1.1から.NET 4.0にアプリケーションを移行しました。 それで、修正する必要のある互換性の問題がたくさんありました。 その1つは、コードブロックがInvalidOperationExceptionを投げていることです。BinarySearch - 配列の2つの要素を比較できません

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

    ... 

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

    ... 

EndFunction 

.NET4に移行する前に、これは.NET1で正しく機能していました。今私が読んできたいくつかのスレッドに基づいて、.NET4.5で修正されたこの問題についての報告がありました。現在のバージョンでこれを修正するには、配列のすべての要素にIComparableインターフェイスを実装する必要があります。

これを修正するにはどうすればよいですか?私はどんな助けとポインタにも感謝します。ありがとう!

EDIT:コード内で使用しているBinarySearchメソッドへのリンクを追加します。 https://msdn.microsoft.com/en-us/library/y15ef976.aspx

+0

比較を行っているバイナリ検索のコードを確認できますか? – codemonkeyliketab

+0

これはSystem.Arrayの組み込み関数です。 – Smiley

+0

どちらですか?私たちはあなたを助けるためにさらに多くの情報が必要です。 – codemonkeyliketab

答えて

0
  1. あなたのクラス定義にImplements IComparableIComparable Interfaceを追加します。 2. IComparable.CompareToのメソッドをクラスに追加します。 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 
    

のCompareTo関数のコードは、(あなたが上に行くことがたくさん用意されていませんでした)自分のクラスに依存します。すべての数値型(Int32およびDoubleなど)は、String、Char、およびDateTimeと同様にIComparableを実装します。カスタム型は、オブジェクトインスタンスの順序付けまたはソートを可能にするIComparableの独自の実装を提供する必要があります。私はそれがあなたの場合の状況かもしれないと信じています。私はこれが役立つことを願っていますこれは、すべての.NETフレームワーク> 2.0で動作するはずです

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

0

はこれを試してみてください。

0

How do I go about to fixing this?

あなたはそれを正しく使用していません。インスタンスメソッドとしてそれを使用しようとするとBinarySearchは、インテリセンスで共有/静的メソッドとdoesntのショーです:

enter image description here

あなたはとにかくそれを入力する場合は、新しいコンパイラ警告を取得:共有メンバーのアクセス...インスタンスを介して...評価されません。 MSDNはNET 1.1用に何も持っていないので、それ以来(疑わしい)変更されているかどうかはわかりません。正しい使用方法:

IndexOf6 = Array.BinarySearch(myIntAry, 6) 

なぜList(Of Int32)にこれを変換しないで、4.5にNET 1.xからの変換の一環として、質問を頼みます。

IndexOf6 = intList.IndexOf(6) 

System.Arrayとは異なり、それが動作するためにソートする必要がないのでList<T>方法はまた、より多くの「スタンドアロン」です:簡単なテストはIndexOf()方法が2~3倍高速であることを示しています。

関連する問題