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 и 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 — это количество элементов в диапазоне.