내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Array.BinarySearch<T> 메서드 (T[], T)

2013-12-13

Array의 각 요소 및 지정한 개체에서 구현되는 IComparable<T> 제네릭 인터페이스를 사용하여 1차원으로 정렬된 전체 Array에서 특정 요소를 검색합니다.

Namespace:  System
어셈블리:  mscorlib(mscorlib.dll)

public static int BinarySearch<T>(
	T[] array,
	T value
)

형식 매개 변수

T

배열 요소의 형식입니다.

매개 변수

array
형식: T []
검색할 1차원으로 정렬된 Array(인덱스는 0부터 시작)입니다.
value
형식: T
검색할 개체입니다.

반환 값

형식: System.Int32
지정된 arrayvalue가 있는 경우 해당 value의 인덱스입니다. value가 없고 valuearray에 있는 하나 이상의 요소보다 작은 경우 value보다 큰 첫째 요소 인덱스의 비트 보수인 음수입니다. value가 없고 valuearray에 있는 요소보다 큰 경우 마지막 요소에 1을 더한 인덱스의 비트 보수인 음수입니다.

예외조건
ArgumentNullException

arraynull인 경우

InvalidOperationException

valueIComparable<T> 제네릭 인터페이스를 구현하지 않고 검색에서 IComparable<T> 제네릭 인터페이스를 구현하지 않는 요소를 발견하는 경우

Array에 지정한 값이 없는 경우 해당 메서드는 음의 정수를 반환합니다. 음수 결과에 비트 보수 연산자(~)를 적용(Visual Basic의 경우 음수 결과와 -1에 대해 Xor 수행)하여 인덱스를 생성할 수 있습니다. 이 인덱스가 배열 크기보다 크거나 같으면 배열에 value보다 큰 요소가 없습니다. 그렇지 않으면 value보다 큰 첫 번째 요소의 인덱스입니다.

value 또는 모든 array 요소에서 비교에 사용되는 IComparable<T> 제네릭 인터페이스를 구현해야 합니다. array의 요소는 IComparable<T> 구현에 정의된 정렬 순서에 따라 값이 증가하도록 정렬되어 있어야 합니다. 그렇지 않으면 잘못된 결과가 반환될 수 있습니다.

참고참고:

valueIComparable<T> 제네릭 인터페이스를 구현하지 않으면 array의 요소는 검색이 시작되기 전에 IComparable<T>에 대해 테스트되지 않습니다. 검색에서 IComparable<T>을 구현하지 않는 요소를 발견하면 예외가 발생합니다.

요소는 중복할 수 있습니다. Arrayvalue와 동일한 요소가 두 개 이상 포함된 경우, 해당 메서드는 발견되는 대상 중 하나에 대한 인덱스만 무작위로 반환합니다.

null은 항상 다른 모든 참조 형식과 비교될 수 있으므로 null과 비교하더라도 예외가 생성되지는 않습니다. 정렬할 때 null은 다른 개체보다 작은 것으로 간주됩니다.

참고참고:

   테스트된 모든 요소의 경우 valuenull인 경우에도 적절한 IComparable<T> 구현에 value가 전달됩니다. 즉, IComparable<T> 구현에서 지정된 요소를 null과 비교하는 방법을 결정합니다.

이 메서드는 O(log n) 연산이며, 여기서 narrayLength입니다.

다음 코드 예제에서는 Sort<T>(T[]) 제네릭 메서드 오버로드와 BinarySearch<T>(T[], T) 제네릭 메서드 오버로드를 보여 줍니다. 이 예제에서는 문자열 배열을 임의의 순서로 만듭니다.

그런 다음 배열을 표시하고 정렬하고 다시 표시합니다. BinarySearch 메서드를 사용하려면 배열을 정렬해야 합니다.

참고참고:

Visual Basic, C# 및 C++에서는 첫 번째 인수의 형식에서 제네릭 형식 매개 변수의 형식을 유추하기 때문에 SortBinarySearch 제네릭 메서드 호출은 상응하는 제네릭이 아닌 메서드 호출과 다르게 보이지 않습니다.

그런 다음 BinarySearch<T>(T[], T) 제네릭 메서드 오버로드를 사용하여 배열에 없는 문자열 하나와 배열에 있는 문자열 하나를 검색할 수 있습니다. 배열 및 BinarySearch 메서드의 반환 값은 ShowWhere 제네릭 메서드에 전달됩니다. 이 메서드는 문자열을 찾으면 해당 인덱스 값을 표시하고, 검색 문자열이 배열에 없으면 해당 문자열 양쪽의 요소를 표시합니다. 문자열이 배열에 없으면 인덱스는 음수이므로 ShowWhere 메서드는 비트 보수(C# 및 Visual C++의 경우 ~ 연산자, Visual Basic의 경우 Xor -1)를 사용하여 목록에서 검색 문자열보다 큰 첫 번째 요소의 인덱스를 가져옵니다.


using System;
using System.Collections.Generic;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      string[] dinosaurs = {"Pachycephalosaurus", 
                              "Amargasaurus", 
                              "Tyrannosaurus", 
                              "Mamenchisaurus", 
                              "Deinonychus", 
                              "Edmontosaurus"};

      outputBlock.Text += "\n";
      foreach (string dinosaur in dinosaurs)
      {
         outputBlock.Text += dinosaur + "\n";
      }

      outputBlock.Text += "\nSort" + "\n";
      Array.Sort(dinosaurs);

      outputBlock.Text += "\n";
      foreach (string dinosaur in dinosaurs)
      {
         outputBlock.Text += dinosaur + "\n";
      }

      outputBlock.Text += "\nBinarySearch for 'Coelophysis':" + "\n";
      int index = Array.BinarySearch(dinosaurs, "Coelophysis");
      ShowWhere(outputBlock, dinosaurs, index);

      outputBlock.Text += "\nBinarySearch for 'Tyrannosaurus':" + "\n";
      index = Array.BinarySearch(dinosaurs, "Tyrannosaurus");
      ShowWhere(outputBlock, dinosaurs, index);
   }

   private static void ShowWhere<T>(System.Windows.Controls.TextBlock outputBlock, T[] array, int index)
   {
      if (index < 0)
      {
         // If the index is negative, it represents the bitwise
         // complement of the next larger element in the array.
         //
         index = ~index;

         outputBlock.Text += "Not found. Sorts between: ";

         if (index == 0)
            outputBlock.Text += "beginning of array and ";
         else
            outputBlock.Text += String.Format("{0} and ", array[index - 1]);

         if (index == array.Length)
            outputBlock.Text += "end of array." + "\n";
         else
            outputBlock.Text += String.Format("{0}.", array[index]) + "\n";
      }
      else
      {
         outputBlock.Text += String.Format("Found at index {0}.", index) + "\n";
      }
   }
}

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Tyrannosaurus
Mamenchisaurus
Deinonychus
Edmontosaurus

Sort

Amargasaurus
Deinonychus
Edmontosaurus
Mamenchisaurus
Pachycephalosaurus
Tyrannosaurus

BinarySearch for 'Coelophysis':
Not found. Sorts between: Amargasaurus and Deinonychus.

BinarySearch for 'Tyrannosaurus':
Found at index 5.
 */


Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

표시:
© 2014 Microsoft