Array.BinarySearchメソッドを使うことでも配列内における要素の位置を検索出来ます。

Array.IndexOfメソッドは先頭から順に1つずつ要素を検証していくのに対し、Array.BinarySearchメソッドは二分探索によって要素を検索するため、より高速に要素の位置を検索できます(§.IndexOfとBinarySearchの速度比較)。 ただし、いくつかの点でArray.IndexOfメソッドとは異なるため、単純にArray.IndexOfメソッドの代わりとしてArray.BinarySearchメソッドを適用できるとは限りません。

まず、Array.BinarySearchメソッドを使って要素の位置を検索する場合、配列の要素が昇順に並んでいる必要があります。 そのため、Array.BinarySearchメソッドを使う場合は、あらかじめ昇順に並んでいる配列に対して使うか、呼び出す前にあらかじめ配列をソートしておくようにします。 昇順に並んでいない配列に対してArray.BinarySearchメソッドを使った場合でも、例外はスローされず、得られる結果も正しいものにはなりません。

次に、Array.BinarySearchメソッドは該当する要素が見つかった場合はそのインデックスを返しますが、Array.IndexOfメソッドとは異なり、該当する要素が複数ある場合でもそのうちもっとも小さいインデックスが返されるとは限りません。 また、配列内に該当する要素が無い場合は負の数が返されます(-1が返されるとは限りません)。

Array.BinarySearchメソッドを使って二分探索によって要素の位置を検索する
using System;

class Sample {
  static void Main()
  {
    // 要素が昇順に並んでいる配列
    int[] arr = {0, 1, 1, 2, 2, 2, 3, 4, 4, 4, 4, 5};

    // IndexOfメソッドで値に2が格納されているインデックスを取得
    Console.WriteLine("IndexOf(2) = {0}", Array.IndexOf(arr, 2));

    // BinarySearchメソッドで値に2が格納されているインデックスを取得
    Console.WriteLine("BinarySearch(2) = {0}", Array.BinarySearch(arr, 2));

    // 値に7が格納されているインデックスを取得
    Console.WriteLine("IndexOf(7) = {0}", Array.IndexOf(arr, 7));
    Console.WriteLine("BinarySearch(7) = {0}", Array.BinarySearch(arr, 7));
  }
}
実行結果
IndexOf(2) = 3
BinarySearch(2) = 5
IndexOf(7) = -1
BinarySearch(7) = -13

なお、Array.BinarySearchメソッドもArray.IndexOfメソッドと同様、多次元配列内の要素の位置を検索することは出来ません。 メソッドに多次元配列を指定すると、RankExceptionがスローされます。