次の方法で共有


Array.BinarySearch メソッド (Array, Object)

1 次元の並べ替え済み Array の各要素および指定したオブジェクトによって実装されている IComparable インターフェイスを使用して、その Array 全体の中から特定の要素を検索します。

Overloads Public Shared Function BinarySearch( _
   ByVal array As Array, _   ByVal value As Object _) As Integer
[C#]
public static int BinarySearch(Arrayarray,objectvalue);
[C++]
public: static int BinarySearch(Array* array,Object* value);
[JScript]
public static function BinarySearch(
   array : Array,value : Object) : int;

パラメータ

  • array
    検索する 1 次元 Array
  • value
    検索するオブジェクト。

戻り値

value が見つかった場合は、指定した array での指定した value のインデックス。

または

value が見つからず、 valuearray 内の 1 つ以上の要素よりも小さい場合は、負の値。これは、 value より大きい最初の要素のインデックスのビットごとの補数となります。

または

value が見つからず、 valuearray 内のどの要素よりも大きい場合は、負の値。これは、最後の要素のインデックス + 1 のビットごとの補数となります。

例外

例外の種類 条件
ArgumentNullException array が null 参照 (Visual Basic では Nothing) です。
RankException array が多次元です。
ArgumentException value が、array の要素と互換性がない型です。
InvalidOperationException value と、array の要素が、いずれも IComparable インターフェイスを実装していません。

解説

value か、または array の各要素のいずれかが、比較に使用される IComparable インターフェイスを実装する必要があります。array の要素が、 IComparable 実装に基づいて、昇順にまだ並べ替えられていない場合は、結果が正しくない可能性があります。

重複する要素を使用できます。 Arrayvalue と等しい要素が複数含まれている場合、このメソッドは 1 つの要素のインデックスしか返しませんが、必ずしも該当する 1 番目の要素のインデックスとは限りません。

null 参照 (Visual Basic では Nothing) は、常に他の任意の型と比較できます。したがって、 null 参照 (Nothing) との比較で、例外は生成されません。並べ替え処理では、 null 参照 (Nothing) は、他のすべてのオブジェクトより小さいと見なされます。

指定した値が Array に格納されていない場合、このメソッドは負の整数を返します。返されたこの負数にビットごとの補数演算子 (~) を適用し、指定した検索値よりも大きい要素がある場合は、そのうちの最初の要素のインデックスを生成できます。

使用例

BinarySearch を使用して Array 内の特定のオブジェクトを検索する方法を次のコード例に示します。

 
Imports System
Imports Microsoft.VisualBasic

Public Class SamplesArray    
    
    Public Shared Sub Main()
        
        ' Creates and initializes a new Array.
        Dim myIntArray As Array = Array.CreateInstance(GetType(Int32), 5)
        Dim i As Integer
        For i = myIntArray.GetLowerBound(0) To myIntArray.GetUpperBound(0)
            myIntArray.SetValue(i * 2, i)
        Next i 
        ' Displays the values of the Array.
        Console.WriteLine("The Int32 array contains the following:")
        PrintValues(myIntArray)
        
        ' Locates a specific object that does not exist in the Array.
        Dim myObjectOdd As Object = 3
        FindMyObject(myIntArray, myObjectOdd)
        
        ' Locates an object that exists in the Array.
        Dim myObjectEven As Object = 6
        FindMyObject(myIntArray, myObjectEven)
    End Sub
    
    
    Public Shared Sub FindMyObject(myArr As Array, myObject As Object)
        Dim myIndex As Integer = Array.BinarySearch(myArr, myObject)
        If myIndex < 0 Then
            Console.WriteLine("The object to search for ({0}) is not found. " _
               + "The next larger object is at index {1}.", myObject, Not(myIndex))
        Else
            Console.WriteLine("The object to search for ({0}) is at index " _
               + "{1}.", myObject, myIndex)
        End If
    End Sub
     
    
    Public Shared Sub PrintValues(myArr As Array)
        Dim myEnumerator As System.Collections.IEnumerator = _
           myArr.GetEnumerator()
        Dim i As Integer = 0
        Dim cols As Integer = myArr.GetLength((myArr.Rank - 1))
        While myEnumerator.MoveNext()
            If i < cols Then
                i += 1
            Else
                Console.WriteLine()
                i = 1
            End If
            Console.Write(ControlChars.Tab + "{0}", myEnumerator.Current)
        End While
        Console.WriteLine()
    End Sub
End Class

' This code produces the following output.
' 
' The Int32 array contains the following:
'     0    2    4    6    8
' The object to search for (3) is not found. The next larger object is at index 2.
' The object to search for (6) is at index 3.  

[C#] 
using System;
public class SamplesArray  {

   public static void Main()  {

      // Creates and initializes a new Array.
      Array myIntArray = Array.CreateInstance( typeof(Int32), 5 );
      for ( int i = myIntArray.GetLowerBound(0); i <= myIntArray.GetUpperBound(0); i++ )
         myIntArray.SetValue( i*2, i );

      // Displays the values of the Array.
      Console.WriteLine( "The Int32 array contains the following:" );
      PrintValues( myIntArray );

      // Locates a specific object that does not exist in the Array.
      Object myObjectOdd = 3;
      FindMyObject( myIntArray, myObjectOdd );

      // Locates an object that exists in the Array.
      Object myObjectEven = 6;
      FindMyObject( myIntArray, myObjectEven );
   }

   public static void FindMyObject( Array myArr, Object myObject )  {
      int myIndex=Array.BinarySearch( myArr, myObject );
      if ( myIndex < 0 )
         Console.WriteLine( "The object to search for ({0}) is not found. The next larger object is at index {1}.", myObject, ~myIndex );
      else
         Console.WriteLine( "The object to search for ({0}) is at index {1}.", myObject, myIndex );
   }


   public static void PrintValues( Array myArr )  {
      System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
      int i = 0;
      int cols = myArr.GetLength( myArr.Rank - 1 );
      while ( myEnumerator.MoveNext() )  {
         if ( i < cols )  {
            i++;
         } else  {
            Console.WriteLine();
            i = 1;
         }
         Console.Write( "\t{0}", myEnumerator.Current );
      }
      Console.WriteLine();
   }
}
/* 
This code produces the following output.

The Int32 array contains the following:
    0    2    4    6    8
The object to search for (3) is not found. The next larger object is at index 2.
The object to search for (6) is at index 3.
 */

[C++] 
#using <mscorlib.dll>
using namespace System;

void FindMyObject( Array* myArr, Object* myObject );
void PrintValues( Array* myArr );

void main()  {
 
   // Creates and initializes a new Array instance.
   Array* myIntArray = Array::CreateInstance( __typeof(Int32), 5 );

   for ( int i = myIntArray->GetLowerBound(0); i <= myIntArray->GetUpperBound(0); i++ )
       myIntArray->SetValue( __box(i*2), i );
 
   // Displays the values of the Array.
   Console::WriteLine( "The Int32 array contains the following:" );
   PrintValues( myIntArray );
 
   // Locates a specific object that does not exist in the Array.
   Object* myObjectOdd = __box(3);
   FindMyObject( myIntArray, myObjectOdd );
 
   // Locates an object that exists in the Array.
   Object* myObjectEven = __box(6);
   FindMyObject( myIntArray, myObjectEven );
}
 
void FindMyObject( Array* myArr, Object* myObject )  {

   int myIndex = Array::BinarySearch( myArr, myObject );

   if ( myIndex < 0 )
    Console::WriteLine( "The object to search for ({0}) is not found. The next larger object is at index {1}.", myObject, __box(~myIndex) );
   else
    Console::WriteLine( "The object to search for ({0}) is at index {1}.", myObject, __box(myIndex) );
}
 
 
void PrintValues( Array* myArr )  {
   System::Collections::IEnumerator* myEnumerator = myArr->GetEnumerator();
   int i = 0;
   int cols = myArr->GetLength( myArr->Rank - 1 );
   while ( myEnumerator->MoveNext() )  {
    if ( i < cols )  {
        i++;
    } 
    else {
        Console::WriteLine();
        i = 1;
    }
    Console::Write( "\t{0}", myEnumerator->Current );
   }
   Console::WriteLine();
}

 /* 
 This code produces the following output.
 
 The Int32 array contains the following:
     0    2    4    6    8
 The object to search for (3) is not found. The next larger object is at index 2.
 The object to search for (6) is at index 3.
  */

[JScript] 
import System
import System.Collections

// Creates and initializes a new Array.
var myIntArray : System.Array = System.Array.CreateInstance( Int32, 5);

for ( var i : int = myIntArray.GetLowerBound(0); i <= myIntArray.GetUpperBound(0); i++ )
    myIntArray.SetValue( Int32(i*2), i );

// Displays the values of the Array.
Console.WriteLine( "The Int32 array contains the following:" );
PrintValues( myIntArray );

// Locates a specific object that does not exist in the Array.
var myObjectOdd : Object  = 3;
FindMyObject( myIntArray, myObjectOdd );

// Locates an object that exists in the Array.
var myObjectEven : Object  = 6;
FindMyObject( myIntArray, myObjectEven );


function FindMyObject( myArr : System.Array, myObject : Object)  {

    var myIndex : int = System.Array.BinarySearch( myArr, myObject );

    if ( myIndex < 0 )
        Console.WriteLine( "The object to search for ({0}) is not found. " + 
                "The next larger object is at index {1}.", myObject, ~myIndex );
    else
        Console.WriteLine( "The object to search for ({0}) is at index {1}.", myObject, myIndex );
}

function PrintValues( myArr : System.Array )  {
    var arrEnum : IEnumerator = myArr.GetEnumerator();
    arrEnum.Reset();

    while (arrEnum.MoveNext()) {            

        Console.Write( "{0,-6}", arrEnum.Current.ToString());
    }

    Console.WriteLine();

}
 /* 
 This code produces the following output.
 
 The Int32 array contains the following:
     0    2    4    6    8
 The object to search for (3) is not found. The next larger object is at index 2.
 The object to search for (6) is at index 3.
  */

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard

参照

Array クラス | Array メンバ | System 名前空間 | Array.BinarySearch オーバーロードの一覧 | IComparable | Sort | カルチャを認識しない配列の操作の実行