none
Array.IndexOf()メソッドが正常な数値を返さない RRS feed

  • 質問


  • 下の様なサンプルプログラムを実行させていますが、 j = Array.IndexOf(d1, 11)の箇所で戻り値が-1になります。
     Dim d1(100) As Byte の行で、Byteの替わりにIntegerを使用すると正常に処理されますが、実際のプログラムではd1(100) as Byteの配列を持つクラスのインスタンスをメモリーの限界近くまで大量に作って処理させます。このためIntegerよりも使用するメモリーの量が減り、動作も高速になるのではないかと思ってByteにしたのです。
     Array.IndexOf(d1, 11)が正常に1を返すには、どうしたら良いのか御教授願います。


       Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
     
            Dim j As Integer
            Dim i As Byte
            Dim d1(100) As Byte

            For i = 0 To 99
                d1(i) = i + 10
            Next

            'd1()の要素が1のインデックスを返す 1が返って欲しい
            j = Array.IndexOf(d1, 11)

            Debug.Print(j) '-1が表示される

            Me.Close()

        End Sub
    2017年8月27日 12:27

回答

  • CByte(11).Equals(CByte(11)) => True だけど、
    CByte(11).Equals(11) => False になるのが原因ですね。

    Object型を取るIndexOf使うのを止めるか、型を一致させてください。
    (あるいは、List(Of Byte)をコンテナにする手もあります)
     Array.IndexOf(Of Byte)(d1, 11)
     Array.IndexOf(d1, CByte(11))


    jzkey

    • 回答としてマーク huahi11112 2017年8月27日 13:14
    • 回答としてマークされていない huahi11112 2017年9月1日 13:01
    • 回答としてマーク huahi11112 2017年9月12日 3:05
    2017年8月27日 12:45

すべての返信

  • コメントが間違っておりました。訂正します。

    'd1()の要素が1のインデックスを返す 1が返って欲しい  ×

    'd1()の要素が11のインデックスを返す 1が返って欲しい  ○


    • 編集済み huahi11112 2017年8月27日 12:45 sdふぁsdふぁsdf
    2017年8月27日 12:45
  • CByte(11).Equals(CByte(11)) => True だけど、
    CByte(11).Equals(11) => False になるのが原因ですね。

    Object型を取るIndexOf使うのを止めるか、型を一致させてください。
    (あるいは、List(Of Byte)をコンテナにする手もあります)
     Array.IndexOf(Of Byte)(d1, 11)
     Array.IndexOf(d1, CByte(11))


    jzkey

    • 回答としてマーク huahi11112 2017年8月27日 13:14
    • 回答としてマークされていない huahi11112 2017年9月1日 13:01
    • 回答としてマーク huahi11112 2017年9月12日 3:05
    2017年8月27日 12:45
  • jzkeyさん

    Array.IndexOf(d1, CByte(11)) で正常に動作しました。

    本日中に回答をいただいたことで、明日の業務の方針が固まりました。

    どうもありがとうございました!

    2017年8月27日 13:16