情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

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

2013/12/12

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

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

public static int BinarySearch(
	Array array,
	Object value
)

パラメーター

array
型: System.Array
検索対象となる並べ替え済みの 1 次元 Array
value
型: System.Object
検索するオブジェクト。

戻り値

型: System.Int32
指定した value が存在する場合は、指定した array におけるその value のインデックス。value が見つからず、valuearray 内の 1 つ以上の要素よりも小さい場合は、負の値。これは、value より大きい最初の要素のインデックスのビットごとの補数となります。value が見つからず、valuearray 内のどの要素よりも大きい場合は、負の値。これは、最後の要素のインデックス + 1 のビットごとの補数となります。

例外条件
ArgumentNullException

arraynull です。

RankException

array が多次元です。

ArgumentException

value が、array の要素と互換性がない型です。

InvalidOperationException

valueIComparable インターフェイスを実装していません。IComparable インターフェイスを実装しない要素が検索で見つかりました。

このメソッドを呼び出す前に、array を並べ替えておく必要があります。

指定した値が Array に格納されていない場合、このメソッドは負の整数を返します。負の結果にビットごとの補数演算子 (~) を適用 (Visual Basic の場合は、負の結果と -1 を Xor 演算) して、インデックスを求めることができます。このインデックスが配列のサイズ以上の値である場合、その配列内に value より大きい要素はありません。それ以外の場合、このインデックスが、value より大きい最初の要素のインデックスになります。

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

メモメモ:

valueIComparable インターフェイスが実装されていない場合、検索の開始前に array の要素に IComparable が実装されているかどうかテストされません。検索時に IComparable が実装されていない要素が検出されると、例外がスローされます。

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

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

メモメモ:

   テストされるすべての要素について、value は適切な IComparable 実装に渡されます。これは valuenull である場合も同じです。つまり、特定の要素を null と比較する方法は、IComparable 実装によって決定されます。

このメソッドは、O(log n) 操作です。ここで、narrayLength です。

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

メモメモ:

ここでは、要素を昇順で格納した配列を作成しています。BinarySearch メソッドでは、配列の要素が昇順で並べ替えられている必要があるためです。

メモメモ:

この例を実行するには、「Windows Phone での静的 TextBlock コントロールのあるコード例のビルド」を参照してください。


using System;
public class Example
{

   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {

      // 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);

      // Do the required sort first
      Array.Sort(myIntArray);

      // Displays the values of the Array.
      outputBlock.Text += "The Int32 array contains the following:" + "\n";
      PrintValues(outputBlock, myIntArray);

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

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

   public static void FindMyObject(System.Windows.Controls.TextBlock outputBlock, Array myArr, Object myObject)
   {
      int myIndex = Array.BinarySearch(myArr, myObject);
      if (myIndex < 0)
         outputBlock.Text += String.Format("The object to search for ({0}) is not found. The next larger object is at index {1}.", myObject, ~myIndex) + "\n";
      else
         outputBlock.Text += String.Format("The object to search for ({0}) is at index {1}.", myObject, myIndex) + "\n";
   }


   public static void PrintValues(System.Windows.Controls.TextBlock outputBlock, 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
         {
            outputBlock.Text += "\n";
            i = 1;
         }
         outputBlock.Text += String.Format("\t{0}", myEnumerator.Current);
      }
      outputBlock.Text += "\n";
   }
}
/* 
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 Phone OS

サポート: 8.0, 7.1, 7.0

表示: