导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Array.BinarySearch 方法 (Array, Object)

2013/12/13

使用由 Array 中每个元素和指定的对象实现的 IComparable 接口,在整个一维排序 Array 中搜索特定元素。

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)

public static int BinarySearch(
	Array array,
	Object value
)

参数

array
类型: System.Array
要搜索的已排序一维 Array
value
类型: System.Object
要搜索的对象。

返回值

类型: System.Int32
如果找到 value,则为指定 array 中的指定 value 的索引。如果找不到 valuevalue 小于 array 中的一个或多个元素,则为一个负数,该负数是大于 value 的第一个元素的索引的按位求补。如果找不到 valuevalue 大于 array 中的任何元素,则为一个负数,该负数是(最后一个元素的索引加 1)的按位求补。

异常条件
ArgumentNullException

arraynull

RankException

array 是多维的。

ArgumentException

value 是不与 array 的元素兼容的类型。

InvalidOperationException

value 没有实现 IComparable 接口,并且搜索时遇到没有实现 IComparable 接口的元素。

调用此方法前,必须对 array 进行排序。

如果 Array 不包含指定值,则该方法会返回负整数。可对负结果应用按位求补运算符 (~)(在 Visual Basic 中,将负结果和 -1 进行 Xor 运算)以生成一个索引。如果此索引大于等于数组的大小,则数组中没有比 value 更大的元素。否则,即为大于 value 的第一个元素的索引。

valuearray 的每个元素都必须实现 IComparable 接口,该接口用于进行比较。array 的元素必须已经根据 IComparable 实现定义的排序顺序按升序排序;否则,结果可能不正确。

说明注意:

如果 value 没有实现 IComparable 接口,则在搜索开始前将不会针对 IComparable 测试 array 的元素。如果搜索时遇到没有实现 IComparable 的元素,将引发异常。

允许重复元素。如果 Array 包含多个值等于 value 的元素,则该方法将仅返回一个匹配项(不一定是第一个匹配项)的索引。

null 总是可以与任何其他引用类型比较,因此与 null 的比较不会产生异常。排序时,null 被视为小于任何其他对象。

说明注意:

对于每个进行测试的元素,都将 value 传递给相应的 IComparable 实现,即使 valuenull 也一样。即,IComparable 实现确定一个给定的元素如何与 null 进行比较。

此方法的运算复杂度为 O(log n),其中 narrayLength

下面的代码示例说明如何使用 BinarySearchArray 中找到特定的对象。

说明注意:

创建数组时,其元素按升序排序。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

Windows Phone

Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2014 Microsoft