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

2013-12-13

지정한 IComparer<T> 제네릭 인터페이스를 사용하여 1차원으로 정렬된 전체 Array에서 값을 검색합니다.

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

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

형식 매개 변수

T

배열 요소의 형식입니다.

매개 변수

array
형식: T []
검색할 1차원으로 정렬된 Array(인덱스는 0부터 시작)입니다.
value
형식: T
검색할 개체입니다.
comparer
형식: System.Collections.Generic.IComparer<T>
요소를 비교할 때 사용하는 IComparer<T> 구현입니다.
-또는-
각 요소의 IComparable<T> 구현을 사용할 경우 null입니다.

반환 값

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

예외조건
ArgumentNullException

arraynull인 경우

ArgumentException

comparernull이고 value의 형식이 array의 요소와 호환되지 않는 경우

InvalidOperationException

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

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

비교자는 요소를 비교하는 방법을 사용자 지정합니다.

comparernull이 아닌 경우 지정한 IComparer<T> 제네릭 인터페이스 구현을 사용하여 array의 요소를 지정한 값과 비교합니다. array의 요소는 comparer에서 정의된 정렬 순서에 따라 값이 증가하도록 정렬되어 있어야 합니다. 그렇지 않으면 잘못된 결과가 반환될 수 있습니다.

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

참고참고:

comparernull이고 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[], IComparer<T>) 제네릭 메서드 오버로드와 BinarySearch<T>(T[], T, IComparer<T>) 제네릭 메서드 오버로드를 보여 줍니다.

이 코드 예제에서는 IComparer<string>(Visual Basic의 경우 IComparer(Of String), Visual C++의 경우 IComparer<String^>) 제네릭 인터페이스를 구현하는 ReverseCompare라는 문자열의 대체 비교자를 정의합니다. 비교자는 CompareTo(String) 메서드를 호출하고 비교 대상의 순서를 반대로 바꾸어 문자열이 오름차순이 아니라 내림차순으로 정렬되도록 합니다.

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

참고참고:

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

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

참고참고:

이 예제를 실행하려면 Windows Phone용 정적 TextBlock 컨트롤이 있는 예제 빌드를 참조하세요.


using System;
using System.Collections.Generic;

public class ReverseComparer : IComparer<string>
{
   public int Compare(string x, string y)
   {
      // Compare y and x in reverse order.
      return y.CompareTo(x);
   }
}

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";
      }

      ReverseComparer rc = new ReverseComparer();

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

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

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

      outputBlock.Text += "\nBinarySearch for 'Tyrannosaurus':" + "\n";
      index = Array.BinarySearch(dinosaurs, "Tyrannosaurus", rc);
      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

Tyrannosaurus
Pachycephalosaurus
Mamenchisaurus
Edmontosaurus
Deinonychus
Amargasaurus

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

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


Windows Phone OS

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

Windows Phone

표시:
© 2015 Microsoft