Поделиться через


List<T>.BinarySearch Метод

Определение

Использует алгоритм двоичного поиска для поиска определенного элемента в отсортированного List<T> или фрагмента.

Перегрузки

Имя Описание
BinarySearch(T)

Выполняет поиск всего отсортированного List<T> элемента с помощью средства сравнения по умолчанию и возвращает отсчитываемый от нуля индекс элемента.

BinarySearch(T, IComparer<T>)

Выполняет поиск всего отсортированного List<T> элемента с помощью указанного средства сравнения и возвращает отсчитываемый от нуля индекс элемента.

BinarySearch(Int32, Int32, T, IComparer<T>)

Выполняет поиск диапазона элементов в отсортированных List<T> элементах с помощью указанного сравнения и возвращает отсчитываемый от нуля индекс элемента.

BinarySearch(T)

Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs

Выполняет поиск всего отсортированного List<T> элемента с помощью средства сравнения по умолчанию и возвращает отсчитываемый от нуля индекс элемента.

public:
 int BinarySearch(T item);
public int BinarySearch(T item);
member this.BinarySearch : 'T -> int
Public Function BinarySearch (item As T) As Integer

Параметры

item
T

Объект для поиска. Значение может быть null для ссылочных типов.

Возвращаемое значение

Отсчитываемый от нуля индекс в отсортированный , если item найден; в противном случае отрицательное число, которое является побитовой дополнением индекса item следующего элемента, который больше item или, если нет большего элемента, побитовое дополнениеCount.List<T>

Исключения

Средство Default сравнения по умолчанию не может найти реализацию универсального IComparable<T> интерфейса или IComparable интерфейса для типа T.

Примеры

В следующем примере демонстрируется перегрузка Sort() метода и перегрузка BinarySearch(T) метода. Строка List<T> создается и заполняется четырьмя строками без определенного порядка. Список отображается, сортируется и отображается снова.

Затем перегрузка BinarySearch(T) метода используется для поиска двух строк, которые не находятся в списке, и Insert метод используется для их вставки. Возвращаемое значение BinarySearch(T) метода отрицательно в каждом случае, так как строки не находятся в списке. Принимая побитовое дополнение (оператор ~ в C#, Xor -1 в Visual Basic) этого отрицательного числа создает индекс первого элемента в списке, который больше строки поиска, и вставка в этом расположении сохраняет порядок сортировки. Вторая строка поиска больше любого элемента в списке, поэтому позиция вставки находится в конце списка.

List<string> dinosaurs = new List<string>();

dinosaurs.Add("Pachycephalosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Mamenchisaurus");
dinosaurs.Add("Deinonychus");

Console.WriteLine("Initial list:");
Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
    Console.WriteLine(dinosaur);
}

Console.WriteLine("\nSort:");
dinosaurs.Sort();

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
    Console.WriteLine(dinosaur);
}

Console.WriteLine("\nBinarySearch and Insert \"Coelophysis\":");
int index = dinosaurs.BinarySearch("Coelophysis");
if (index < 0)
{
    dinosaurs.Insert(~index, "Coelophysis");
}

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
    Console.WriteLine(dinosaur);
}

Console.WriteLine("\nBinarySearch and Insert \"Tyrannosaurus\":");
index = dinosaurs.BinarySearch("Tyrannosaurus");
if (index < 0)
{
    dinosaurs.Insert(~index, "Tyrannosaurus");
}

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
    Console.WriteLine(dinosaur);
}
/* This code example produces the following output:

Initial list:

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Deinonychus

Sort:

Amargasaurus
Deinonychus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Coelophysis":

Amargasaurus
Coelophysis
Deinonychus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Tyrannosaurus":

Amargasaurus
Coelophysis
Deinonychus
Mamenchisaurus
Pachycephalosaurus
Tyrannosaurus
*/
Imports System.Collections.Generic

Public Class Example

    Public Shared Sub Main()

        Dim dinosaurs As New List(Of String)

        dinosaurs.Add("Pachycephalosaurus")
        dinosaurs.Add("Amargasaurus")
        dinosaurs.Add("Mamenchisaurus")
        dinosaurs.Add("Deinonychus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        Console.WriteLine(vbLf & "Sort")
        dinosaurs.Sort

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        Console.WriteLine(vbLf & _
            "BinarySearch and Insert ""Coelophysis"":")
        Dim index As Integer = dinosaurs.BinarySearch("Coelophysis")
        If index < 0 Then
            index = index Xor -1
            dinosaurs.Insert(index, "Coelophysis")
        End If

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        Console.WriteLine(vbLf & _
            "BinarySearch and Insert ""Tyrannosaurus"":")
        index = dinosaurs.BinarySearch("Tyrannosaurus")
        If index < 0 Then
            index = index Xor -1
            dinosaurs.Insert(index, "Tyrannosaurus")
        End If

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

    End Sub
End Class

' This code example produces the following output:
'
'Pachycephalosaurus
'Amargasaurus
'Mamenchisaurus
'Deinonychus
'
'Sort
'
'Amargasaurus
'Deinonychus
'Mamenchisaurus
'Pachycephalosaurus
'
'BinarySearch and Insert "Coelophysis":
'
'Amargasaurus
'Coelophysis
'Deinonychus
'Mamenchisaurus
'Pachycephalosaurus
'
'BinarySearch and Insert "Tyrannosaurus":
'
'Amargasaurus
'Coelophysis
'Deinonychus
'Mamenchisaurus
'Pachycephalosaurus
'Tyrannosaurus

Комментарии

Этот метод использует средство Comparer<T>.Default сравнения по умолчанию для типа T , чтобы определить порядок элементов списка. Свойство Comparer<T>.Default проверяет, реализует ли тип T универсальный IComparable<T> интерфейс и использует ли эта реализация, если она доступна. Если нет, проверяет, Comparer<T>.Default реализует IComparable ли тип T интерфейс. Если тип T не реализует ни один интерфейс, Comparer<T>.Default вызывает исключение InvalidOperationException.

Он List<T> уже должен быть отсортирован в соответствии с реализацией средства сравнения; в противном случае результат некорректен.

null Сравнение с любым ссылочным типом разрешено и не создает исключение при использовании универсального IComparable<T> интерфейса. При сортировке null считается меньше, чем любой другой объект.

Если содержит List<T> несколько элементов с одинаковым значением, метод возвращает только одно из вхождений и может возвращать любое из вхождений, а не обязательно первое.

Если значение List<T> не содержит указанное значение, метод возвращает отрицательное целое число. Можно применить побитовую операцию дополнения (~) к этому отрицательному целочислению, чтобы получить индекс первого элемента, превышающего значение поиска. При вставке значения в List<T>этот индекс следует использовать в качестве точки вставки для поддержания порядка сортировки.

Этот метод является операцией O(log n), где n — это количество элементов в диапазоне.

См. также раздел

Применяется к

BinarySearch(T, IComparer<T>)

Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs

Выполняет поиск всего отсортированного List<T> элемента с помощью указанного средства сравнения и возвращает отсчитываемый от нуля индекс элемента.

public:
 int BinarySearch(T item, System::Collections::Generic::IComparer<T> ^ comparer);
public int BinarySearch(T item, System.Collections.Generic.IComparer<T> comparer);
public int BinarySearch(T item, System.Collections.Generic.IComparer<T>? comparer);
member this.BinarySearch : 'T * System.Collections.Generic.IComparer<'T> -> int
Public Function BinarySearch (item As T, comparer As IComparer(Of T)) As Integer

Параметры

item
T

Объект для поиска. Значение может быть null для ссылочных типов.

comparer
IComparer<T>

Реализация, используемая IComparer<T> при сравнении элементов.

–или–

null для использования средства Defaultсравнения по умолчанию.

Возвращаемое значение

Отсчитываемый от нуля индекс в отсортированный , если item найден; в противном случае отрицательное число, которое является побитовой дополнением индекса item следующего элемента, который больше item или, если нет большего элемента, побитовое дополнениеCount.List<T>

Исключения

comparer is null, и средство Default сравнения по умолчанию не может найти реализацию универсального IComparable<T> интерфейса или IComparable интерфейса для типа T.

Примеры

В следующем примере демонстрируется перегрузка Sort(IComparer<T>) метода и перегрузка BinarySearch(T, IComparer<T>) метода.

В примере определяется альтернативный средство сравнения строк с именем DinoCompare, реализующее IComparer<string> универсальный интерфейс (IComparer(Of String) в Visual Basic). Средство сравнения работает следующим образом: во-первых, сравниваемые элементы проверяются для null, а ссылка null обрабатывается как меньше, чем значение null. Во-вторых, длина строки сравнивается, а длинная строка считается большей. В-третьих, если длина равна, используется обычное сравнение строк.

Строка List<T> создается и заполняется четырьмя строками без определенного порядка. Список отображается, отсортирован с помощью альтернативного средства сравнения и отображается снова.

Затем BinarySearch(T, IComparer<T>) перегрузка метода используется для поиска нескольких строк, которые не находятся в списке, используя альтернативный сопоставитель. Метод Insert используется для вставки строк. Эти два метода расположены в функции с именем SearchAndInsert, а также код для принятия побитового дополнения (оператора ~ в C#, Xor -1 в Visual Basic) отрицательного числа, возвращаемого BinarySearch(T, IComparer<T>) и используйте его в качестве индекса для вставки новой строки.

using System;
using System.Collections.Generic;

public class DinoComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (x == null)
        {
            if (y == null)
            {
                // If x is null and y is null, they're
                // equal.
                return 0;
            }
            else
            {
                // If x is null and y is not null, y
                // is greater.
                return -1;
            }
        }
        else
        {
            // If x is not null...
            //
            if (y == null)
                // ...and y is null, x is greater.
            {
                return 1;
            }
            else
            {
                // ...and y is not null, compare the
                // lengths of the two strings.
                //
                int retval = x.Length.CompareTo(y.Length);

                if (retval != 0)
                {
                    // If the strings are not of equal length,
                    // the longer string is greater.
                    //
                    return retval;
                }
                else
                {
                    // If the strings are of equal length,
                    // sort them with ordinary string comparison.
                    //
                    return x.CompareTo(y);
                }
            }
        }
    }
}

public class Example
{
    public static void Main()
    {
        List<string> dinosaurs = new List<string>();
        dinosaurs.Add("Pachycephalosaurus");
        dinosaurs.Add("Amargasaurus");
        dinosaurs.Add("Mamenchisaurus");
        dinosaurs.Add("Deinonychus");
        Display(dinosaurs);

        DinoComparer dc = new DinoComparer();

        Console.WriteLine("\nSort with alternate comparer:");
        dinosaurs.Sort(dc);
        Display(dinosaurs);

        SearchAndInsert(dinosaurs, "Coelophysis", dc);
        Display(dinosaurs);

        SearchAndInsert(dinosaurs, "Oviraptor", dc);
        Display(dinosaurs);

        SearchAndInsert(dinosaurs, "Tyrannosaur", dc);
        Display(dinosaurs);

        SearchAndInsert(dinosaurs, null, dc);
        Display(dinosaurs);
    }

    private static void SearchAndInsert(List<string> list,
        string insert, DinoComparer dc)
    {
        Console.WriteLine("\nBinarySearch and Insert \"{0}\":", insert);

        int index = list.BinarySearch(insert, dc);

        if (index < 0)
        {
            list.Insert(~index, insert);
        }
    }

    private static void Display(List<string> list)
    {
        Console.WriteLine();
        foreach( string s in list )
        {
            Console.WriteLine(s);
        }
    }
}

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Deinonychus

Sort with alternate comparer:

Deinonychus
Amargasaurus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Coelophysis":

Coelophysis
Deinonychus
Amargasaurus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Oviraptor":

Oviraptor
Coelophysis
Deinonychus
Amargasaurus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Tyrannosaur":

Oviraptor
Coelophysis
Deinonychus
Tyrannosaur
Amargasaurus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "":


Oviraptor
Coelophysis
Deinonychus
Tyrannosaur
Amargasaurus
Mamenchisaurus
Pachycephalosaurus
 */
Imports System.Collections.Generic

Public Class DinoComparer
    Implements IComparer(Of String)

    Public Function Compare(ByVal x As String, _
        ByVal y As String) As Integer _
        Implements IComparer(Of String).Compare

        If x Is Nothing Then
            If y Is Nothing Then 
                ' If x is Nothing and y is Nothing, they're
                ' equal. 
                Return 0
            Else
                ' If x is Nothing and y is not Nothing, y
                ' is greater. 
                Return -1
            End If
        Else
            ' If x is not Nothing...
            '
            If y Is Nothing Then
                ' ...and y is Nothing, x is greater.
                Return 1
            Else
                ' ...and y is not Nothing, compare the 
                ' lengths of the two strings.
                '
                Dim retval As Integer = _
                    x.Length.CompareTo(y.Length)

                If retval <> 0 Then 
                    ' If the strings are not of equal length,
                    ' the longer string is greater.
                    '
                    Return retval
                Else
                    ' If the strings are of equal length,
                    ' sort them with ordinary string comparison.
                    '
                    Return x.CompareTo(y)
                End If
            End If
        End If
    End Function
End Class

Public Class Example

    Public Shared Sub Main()

        Dim dinosaurs As New List(Of String)
        dinosaurs.Add("Pachycephalosaurus")
        dinosaurs.Add("Amargasaurus")
        dinosaurs.Add("Mamenchisaurus")
        dinosaurs.Add("Deinonychus")
        Display(dinosaurs)

        Dim dc As New DinoComparer

        Console.WriteLine(vbLf & "Sort with alternate comparer:")
        dinosaurs.Sort(dc)
        Display(dinosaurs)

        SearchAndInsert(dinosaurs, "Coelophysis", dc)
        Display(dinosaurs)

        SearchAndInsert(dinosaurs, "Oviraptor", dc)
        Display(dinosaurs)

        SearchAndInsert(dinosaurs, "Tyrannosaur", dc)
        Display(dinosaurs)

        SearchAndInsert(dinosaurs, Nothing, dc)
        Display(dinosaurs)
    End Sub

    Private Shared Sub SearchAndInsert( _
        ByVal lis As List(Of String), _
        ByVal insert As String, ByVal dc As DinoComparer)

        Console.WriteLine(vbLf & _
            "BinarySearch and Insert ""{0}"":", insert)

        Dim index As Integer = lis.BinarySearch(insert, dc)

        If index < 0 Then
            index = index Xor -1
            lis.Insert(index, insert)
        End If
    End Sub

    Private Shared Sub Display(ByVal lis As List(Of String))
        Console.WriteLine()
        For Each s As String In lis
            Console.WriteLine(s)
        Next
    End Sub
End Class

' This code example produces the following output:
'
'Pachycephalosaurus
'Amargasaurus
'Mamenchisaurus
'Deinonychus
'
'Sort with alternate comparer:
'
'Deinonychus
'Amargasaurus
'Mamenchisaurus
'Pachycephalosaurus
'
'BinarySearch and Insert "Coelophysis":
'
'Coelophysis
'Deinonychus
'Amargasaurus
'Mamenchisaurus
'Pachycephalosaurus
'
'BinarySearch and Insert "Oviraptor":
'
'Oviraptor
'Coelophysis
'Deinonychus
'Amargasaurus
'Mamenchisaurus
'Pachycephalosaurus
'
'BinarySearch and Insert "Tyrannosaur":
'
'Oviraptor
'Coelophysis
'Deinonychus
'Tyrannosaur
'Amargasaurus
'Mamenchisaurus
'Pachycephalosaurus
'
'BinarySearch and Insert "":
'
'
'Oviraptor
'Coelophysis
'Deinonychus
'Tyrannosaur
'Amargasaurus
'Mamenchisaurus
'Pachycephalosaurus

Комментарии

Средство сравнения настраивает сравнение элементов. Например, экземпляр можно использовать CaseInsensitiveComparer в качестве сравнения для выполнения поиска строки без учета регистра.

Если comparer задано, элементы объекта List<T> сравниваются с указанным значением с помощью указанной IComparer<T> реализации.

Если comparer это nullтак, средство Comparer<T>.Default сравнения по умолчанию проверяет, реализует ли тип T универсальный IComparable<T> интерфейс и использует реализацию, если она доступна. Если нет, проверяет, Comparer<T>.Default реализует IComparable ли тип T интерфейс. Если тип T не реализует ни один интерфейс, Comparer<T>.Default вызывает исключение InvalidOperationException.

Он List<T> уже должен быть отсортирован в соответствии с реализацией средства сравнения; в противном случае результат некорректен.

null Сравнение с любым ссылочным типом разрешено и не создает исключение при использовании универсального IComparable<T> интерфейса. При сортировке null считается меньше, чем любой другой объект.

Если содержит List<T> несколько элементов с одинаковым значением, метод возвращает только одно из вхождений и может возвращать любое из вхождений, а не обязательно первое.

Если значение List<T> не содержит указанное значение, метод возвращает отрицательное целое число. Можно применить побитовую операцию дополнения (~) к этому отрицательному целочислению, чтобы получить индекс первого элемента, превышающего значение поиска. При вставке значения в List<T>этот индекс следует использовать в качестве точки вставки для поддержания порядка сортировки.

Этот метод является операцией O(log n), где n — это количество элементов в диапазоне.

См. также раздел

Применяется к

BinarySearch(Int32, Int32, T, IComparer<T>)

Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs

Выполняет поиск диапазона элементов в отсортированных List<T> элементах с помощью указанного сравнения и возвращает отсчитываемый от нуля индекс элемента.

public:
 int BinarySearch(int index, int count, T item, System::Collections::Generic::IComparer<T> ^ comparer);
public int BinarySearch(int index, int count, T item, System.Collections.Generic.IComparer<T> comparer);
public int BinarySearch(int index, int count, T item, System.Collections.Generic.IComparer<T>? comparer);
member this.BinarySearch : int * int * 'T * System.Collections.Generic.IComparer<'T> -> int
Public Function BinarySearch (index As Integer, count As Integer, item As T, comparer As IComparer(Of T)) As Integer

Параметры

index
Int32

Отсчитываемый от нуля начальный индекс диапазона для поиска.

count
Int32

Длина диапазона для поиска.

item
T

Объект для поиска. Значение может быть null для ссылочных типов.

comparer
IComparer<T>

Реализация IComparer<T> , используемая при сравнении элементов или null для использования средства Defaultсравнения по умолчанию.

Возвращаемое значение

Отсчитываемый от нуля индекс в отсортированный , если item найден; в противном случае отрицательное число, которое является побитовой дополнением индекса item следующего элемента, который больше item или, если нет большего элемента, побитовое дополнениеCount.List<T>

Исключения

index меньше 0.

–или–

count меньше 0.

index и count не обозначайте допустимый диапазон в List<T>.

comparer is null, и средство Default сравнения по умолчанию не может найти реализацию универсального IComparable<T> интерфейса или IComparable интерфейса для типа T.

Примеры

В следующем примере демонстрируется перегрузка Sort(Int32, Int32, IComparer<T>) метода и перегрузка BinarySearch(Int32, Int32, T, IComparer<T>) метода.

В примере определяется альтернативный средство сравнения строк с именем DinoCompare, реализующее IComparer<string> универсальный интерфейс (IComparer(Of String) в Visual Basic). Средство сравнения работает следующим образом: во-первых, сравниваемые элементы проверяются для null, а ссылка null обрабатывается как меньше, чем значение null. Во-вторых, длина строки сравнивается, а длинная строка считается большей. В-третьих, если длина равна, используется обычное сравнение строк.

Строка List<T> создается и заполняется именами пяти травядных динозавров и трех плотных динозавров. В каждой из двух групп имена не находятся в определенном порядке сортировки. Отображается список, диапазон травоядных объектов сортируется с помощью альтернативного средства сравнения, а список отображается снова.

Затем BinarySearch(Int32, Int32, T, IComparer<T>) перегрузка метода используется для поиска только диапазона травоядных для "Brachiosaurus". Строка не найдена, а побитовое дополнение (оператор ~ в C#, -1 в Visual Basic) отрицательного числаBinarySearch(Int32, Int32, T, IComparer<T>), возвращаемого методом, Xor используется в качестве индекса для вставки новой строки.

using System;
using System.Collections.Generic;

public class DinoComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (x == null)
        {
            if (y == null)
            {
                // If x is null and y is null, they're
                // equal.
                return 0;
            }
            else
            {
                // If x is null and y is not null, y
                // is greater.
                return -1;
            }
        }
        else
        {
            // If x is not null...
            //
            if (y == null)
                // ...and y is null, x is greater.
            {
                return 1;
            }
            else
            {
                // ...and y is not null, compare the
                // lengths of the two strings.
                //
                int retval = x.Length.CompareTo(y.Length);

                if (retval != 0)
                {
                    // If the strings are not of equal length,
                    // the longer string is greater.
                    //
                    return retval;
                }
                else
                {
                    // If the strings are of equal length,
                    // sort them with ordinary string comparison.
                    //
                    return x.CompareTo(y);
                }
            }
        }
    }
}

public class Example
{
    public static void Main()
    {
        List<string> dinosaurs = new List<string>();

        dinosaurs.Add("Pachycephalosaurus");
        dinosaurs.Add("Parasauralophus");
        dinosaurs.Add("Amargasaurus");
        dinosaurs.Add("Galimimus");
        dinosaurs.Add("Mamenchisaurus");
        dinosaurs.Add("Deinonychus");
        dinosaurs.Add("Oviraptor");
        dinosaurs.Add("Tyrannosaurus");

        int herbivores = 5;
        Display(dinosaurs);

        DinoComparer dc = new DinoComparer();

        Console.WriteLine("\nSort a range with the alternate comparer:");
        dinosaurs.Sort(0, herbivores, dc);
        Display(dinosaurs);

        Console.WriteLine("\nBinarySearch a range and Insert \"{0}\":",
            "Brachiosaurus");

        int index = dinosaurs.BinarySearch(0, herbivores, "Brachiosaurus", dc);

        if (index < 0)
        {
            dinosaurs.Insert(~index, "Brachiosaurus");
            herbivores++;
        }

        Display(dinosaurs);
    }

    private static void Display(List<string> list)
    {
        Console.WriteLine();
        foreach( string s in list )
        {
            Console.WriteLine(s);
        }
    }
}

/* This code example produces the following output:

Pachycephalosaurus
Parasauralophus
Amargasaurus
Galimimus
Mamenchisaurus
Deinonychus
Oviraptor
Tyrannosaurus

Sort a range with the alternate comparer:

Galimimus
Amargasaurus
Mamenchisaurus
Parasauralophus
Pachycephalosaurus
Deinonychus
Oviraptor
Tyrannosaurus

BinarySearch a range and Insert "Brachiosaurus":

Galimimus
Amargasaurus
Brachiosaurus
Mamenchisaurus
Parasauralophus
Pachycephalosaurus
Deinonychus
Oviraptor
Tyrannosaurus
 */
Imports System.Collections.Generic

Public Class DinoComparer
    Implements IComparer(Of String)

    Public Function Compare(ByVal x As String, _
        ByVal y As String) As Integer _
        Implements IComparer(Of String).Compare

        If x Is Nothing Then
            If y Is Nothing Then 
                ' If x is Nothing and y is Nothing, they're
                ' equal. 
                Return 0
            Else
                ' If x is Nothing and y is not Nothing, y
                ' is greater. 
                Return -1
            End If
        Else
            ' If x is not Nothing...
            '
            If y Is Nothing Then
                ' ...and y is Nothing, x is greater.
                Return 1
            Else
                ' ...and y is not Nothing, compare the 
                ' lengths of the two strings.
                '
                Dim retval As Integer = _
                    x.Length.CompareTo(y.Length)

                If retval <> 0 Then 
                    ' If the strings are not of equal length,
                    ' the longer string is greater.
                    '
                    Return retval
                Else
                    ' If the strings are of equal length,
                    ' sort them with ordinary string comparison.
                    '
                    Return x.CompareTo(y)
                End If
            End If
        End If
    End Function
End Class

Public Class Example

    Public Shared Sub Main()

        Dim dinosaurs As New List(Of String)

        dinosaurs.Add("Pachycephalosaurus")
        dinosaurs.Add("Parasauralophus")
        dinosaurs.Add("Amargasaurus")
        dinosaurs.Add("Galimimus")
        dinosaurs.Add("Mamenchisaurus")
        dinosaurs.Add("Deinonychus")
        dinosaurs.Add("Oviraptor")
        dinosaurs.Add("Tyrannosaurus")

        Dim herbivores As Integer = 5
        Display(dinosaurs)

        Dim dc As New DinoComparer

        Console.WriteLine(vbLf & _
            "Sort a range with the alternate comparer:")
        dinosaurs.Sort(0, herbivores, dc)
        Display(dinosaurs)

        Console.WriteLine(vbLf & _
            "BinarySearch a range and Insert ""{0}"":", _
            "Brachiosaurus")

        Dim index As Integer = _
            dinosaurs.BinarySearch(0, herbivores, "Brachiosaurus", dc)

        If index < 0 Then
            index = index Xor -1
            dinosaurs.Insert(index, "Brachiosaurus")
            herbivores += 1
        End If

        Display(dinosaurs)

    End Sub

    Private Shared Sub Display(ByVal lis As List(Of String))
        Console.WriteLine()
        For Each s As String In lis
            Console.WriteLine(s)
        Next
    End Sub
End Class

' This code example produces the following output:
'
'Pachycephalosaurus
'Parasauralophus
'Amargasaurus
'Galimimus
'Mamenchisaurus
'Deinonychus
'Oviraptor
'Tyrannosaurus
'
'Sort a range with the alternate comparer:
'
'Galimimus
'Amargasaurus
'Mamenchisaurus
'Parasauralophus
'Pachycephalosaurus
'Deinonychus
'Oviraptor
'Tyrannosaurus
'
'BinarySearch a range and Insert "Brachiosaurus":
'
'Galimimus
'Amargasaurus
'Brachiosaurus
'Mamenchisaurus
'Parasauralophus
'Pachycephalosaurus
'Deinonychus
'Oviraptor
'Tyrannosaurus

Комментарии

Средство сравнения настраивает сравнение элементов. Например, экземпляр можно использовать CaseInsensitiveComparer в качестве сравнения для выполнения поиска строки без учета регистра.

Если comparer задано, элементы объекта List<T> сравниваются с указанным значением с помощью указанной IComparer<T> реализации.

Если comparer это nullтак, средство Comparer<T>.Default сравнения по умолчанию проверяет, реализует ли тип T универсальный IComparable<T> интерфейс и использует реализацию, если она доступна. Если нет, проверяет, Comparer<T>.Default реализует IComparable ли тип T интерфейс. Если тип T не реализует ни один интерфейс, Comparer<T>.Default вызывает исключение InvalidOperationException.

Он List<T> уже должен быть отсортирован в соответствии с реализацией средства сравнения; в противном случае результат некорректен.

null Сравнение с любым ссылочным типом разрешено и не создает исключение при использовании универсального IComparable<T> интерфейса. При сортировке null считается меньше, чем любой другой объект.

Если содержит List<T> несколько элементов с одинаковым значением, метод возвращает только одно из вхождений и может возвращать любое из вхождений, а не обязательно первое.

Если значение List<T> не содержит указанное значение, метод возвращает отрицательное целое число. Можно применить побитовую операцию дополнения (~) к этому отрицательному целочислению, чтобы получить индекс первого элемента, превышающего значение поиска. При вставке значения в List<T>этот индекс следует использовать в качестве точки вставки для поддержания порядка сортировки.

Этот метод является операцией O(log n), где n — это количество элементов в диапазоне.

См. также раздел

Применяется к