Bagikan melalui


List<T>.BinarySearch Metode

Definisi

Menggunakan algoritma pencarian biner untuk menemukan elemen tertentu dalam yang diurutkan List<T> atau sebagiannya.

Overload

Nama Deskripsi
BinarySearch(T)

Mencari seluruh yang diurutkan List<T> untuk elemen menggunakan pembanding default dan mengembalikan indeks elemen berbasis nol.

BinarySearch(T, IComparer<T>)

Mencari seluruh yang diurutkan List<T> untuk elemen menggunakan pembanding yang ditentukan dan mengembalikan indeks elemen berbasis nol.

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

Mencari rentang elemen dalam elemen yang diurutkan List<T> untuk elemen menggunakan pembanding yang ditentukan dan mengembalikan indeks elemen berbasis nol.

BinarySearch(T)

Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs

Mencari seluruh yang diurutkan List<T> untuk elemen menggunakan pembanding default dan mengembalikan indeks elemen berbasis nol.

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

Parameter

item
T

Objek yang akan ditemukan. Nilainya bisa null untuk jenis referensi.

Mengembalikan

Indeks item berbasis nol dalam yang diurutkan List<T>, jika item ditemukan; jika tidak, angka negatif yang merupakan pelengkap bitwise dari indeks elemen berikutnya yang lebih besar dari atau, jika tidak ada elemen yang lebih item besar, pelengkap bitwise dari Count.

Pengecualian

Pembanding Default default tidak dapat menemukan implementasi IComparable<T> antarmuka generik atau IComparable antarmuka untuk jenis T.

Contoh

Contoh berikut menunjukkan Sort() kelebihan beban metode dan BinarySearch(T) metode kelebihan beban. String List<T> dibuat dan diisi dengan empat string, dalam urutan tertentu. Daftar ditampilkan, diurutkan, dan ditampilkan lagi.

Metode BinarySearch(T) kelebihan beban kemudian digunakan untuk mencari dua string yang tidak ada dalam daftar, dan Insert metode digunakan untuk menyisipkannya. Nilai BinarySearch(T) pengembalian metode negatif dalam setiap kasus, karena string tidak ada dalam daftar. Mengambil pelengkap bitwise (operator ~ di C#, Xor -1 di Visual Basic) dari angka negatif ini menghasilkan indeks elemen pertama dalam daftar yang lebih besar dari string pencarian, dan menyisipkan di lokasi ini mempertahankan urutan pengurutan. String pencarian kedua lebih besar dari elemen apa pun dalam daftar, sehingga posisi penyisipan berada di akhir daftar.

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

Keterangan

Metode ini menggunakan perbandingan Comparer<T>.Default default untuk jenis T untuk menentukan urutan elemen daftar. Properti Comparer<T>.Default memeriksa apakah jenis T mengimplementasikan antarmuka generik dan menggunakan implementasi tersebut IComparable<T> , jika tersedia. Jika tidak, Comparer<T>.Default memeriksa apakah jenis T mengimplementasikan IComparable antarmuka. Jika jenis T tidak mengimplementasikan salah satu antarmuka, Comparer<T>.Default melempar .InvalidOperationException

List<T> harus sudah diurutkan sesuai dengan implementasi pembanding; jika tidak, hasilnya salah.

Membandingkan null dengan jenis referensi apa pun diizinkan dan tidak menghasilkan pengecualian saat menggunakan IComparable<T> antarmuka generik. Saat mengurutkan, null dianggap kurang dari objek lainnya.

List<T> Jika berisi lebih dari satu elemen dengan nilai yang sama, metode hanya mengembalikan salah satu kemunculan, dan mungkin mengembalikan salah satu kemunculan, belum tentu yang pertama.

List<T> Jika tidak berisi nilai yang ditentukan, metode mengembalikan bilangan bulat negatif. Anda dapat menerapkan operasi pelengkap bitwise (~) ke bilangan bulat negatif ini untuk mendapatkan indeks elemen pertama yang lebih besar dari nilai pencarian. Saat menyisipkan nilai ke dalam List<T>, indeks ini harus digunakan sebagai titik penyisipan untuk mempertahankan urutan pengurutan.

Metode ini adalah operasi O(log n), di mana n adalah jumlah elemen dalam rentang.

Lihat juga

Berlaku untuk

BinarySearch(T, IComparer<T>)

Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs

Mencari seluruh yang diurutkan List<T> untuk elemen menggunakan pembanding yang ditentukan dan mengembalikan indeks elemen berbasis nol.

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

Parameter

item
T

Objek yang akan ditemukan. Nilainya bisa null untuk jenis referensi.

comparer
IComparer<T>

Implementasi IComparer<T> yang digunakan saat membandingkan elemen.

-atau-

null untuk menggunakan comparer Defaultdefault .

Mengembalikan

Indeks item berbasis nol dalam yang diurutkan List<T>, jika item ditemukan; jika tidak, angka negatif yang merupakan pelengkap bitwise dari indeks elemen berikutnya yang lebih besar dari atau, jika tidak ada elemen yang lebih item besar, pelengkap bitwise dari Count.

Pengecualian

comparer adalah null, dan pembanding Default default tidak dapat menemukan implementasi IComparable<T> antarmuka generik atau IComparable antarmuka untuk jenis T.

Contoh

Contoh berikut menunjukkan Sort(IComparer<T>) kelebihan beban metode dan BinarySearch(T, IComparer<T>) metode kelebihan beban.

Contoh mendefinisikan perbandingan alternatif untuk string bernama DinoCompare, yang mengimplementasikan IComparer<string> antarmuka generik (IComparer(Of String) di Visual Basic). Pembanding berfungsi sebagai berikut: Pertama, perbandingan diuji untuk null, dan referensi null diperlakukan kurang dari non-null. Kedua, panjang string dibandingkan, dan string yang lebih panjang dianggap lebih besar. Ketiga, jika panjangnya sama, perbandingan string biasa digunakan.

String List<T> dibuat dan diisi dengan empat string, dalam urutan tertentu. Daftar ditampilkan, diurutkan menggunakan pembanding alternatif, dan ditampilkan lagi.

Metode BinarySearch(T, IComparer<T>) kelebihan beban kemudian digunakan untuk mencari beberapa string yang tidak ada dalam daftar, menggunakan perbandingan alternatif. Metode Insert ini digunakan untuk menyisipkan string. Kedua metode ini terletak dalam fungsi bernama SearchAndInsert, bersama dengan kode untuk mengambil pelengkap bitwise (operator ~ di C#, Xor -1 di Visual Basic) dari angka negatif yang dikembalikan oleh BinarySearch(T, IComparer<T>) dan menggunakannya sebagai indeks untuk menyisipkan string baru.

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

Keterangan

Pembanding menyesuaikan bagaimana elemen dibandingkan. Misalnya, Anda dapat menggunakan CaseInsensitiveComparer instans sebagai pembanding untuk melakukan pencarian string yang tidak peka huruf besar/kecil.

Jika comparer disediakan, elemen List<T> dibandingkan dengan nilai yang ditentukan menggunakan implementasi yang ditentukan IComparer<T> .

Jika comparer adalah null, pembanding Comparer<T>.Default default memeriksa apakah jenis T mengimplementasikan antarmuka generik dan menggunakan implementasi tersebut IComparable<T> , jika tersedia. Jika tidak, Comparer<T>.Default memeriksa apakah jenis T mengimplementasikan IComparable antarmuka. Jika jenis T tidak mengimplementasikan salah satu antarmuka, Comparer<T>.Default melemparkan InvalidOperationException.

List<T> harus sudah diurutkan sesuai dengan implementasi pembanding; jika tidak, hasilnya salah.

Membandingkan null dengan jenis referensi apa pun diizinkan dan tidak menghasilkan pengecualian saat menggunakan IComparable<T> antarmuka generik. Saat mengurutkan, null dianggap kurang dari objek lainnya.

List<T> Jika berisi lebih dari satu elemen dengan nilai yang sama, metode hanya mengembalikan salah satu kemunculan, dan mungkin mengembalikan salah satu kemunculan, belum tentu yang pertama.

List<T> Jika tidak berisi nilai yang ditentukan, metode mengembalikan bilangan bulat negatif. Anda dapat menerapkan operasi pelengkap bitwise (~) ke bilangan bulat negatif ini untuk mendapatkan indeks elemen pertama yang lebih besar dari nilai pencarian. Saat menyisipkan nilai ke dalam List<T>, indeks ini harus digunakan sebagai titik penyisipan untuk mempertahankan urutan pengurutan.

Metode ini adalah operasi O(log n), di mana n adalah jumlah elemen dalam rentang.

Lihat juga

Berlaku untuk

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

Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs
Sumber:
List.cs

Mencari rentang elemen dalam elemen yang diurutkan List<T> untuk elemen menggunakan pembanding yang ditentukan dan mengembalikan indeks elemen berbasis nol.

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

Parameter

index
Int32

Indeks awal berbasis nol dari rentang yang akan dicari.

count
Int32

Panjang rentang yang akan dicari.

item
T

Objek yang akan ditemukan. Nilainya bisa null untuk jenis referensi.

comparer
IComparer<T>

Implementasi IComparer<T> yang digunakan saat membandingkan elemen, atau null untuk menggunakan perbandingan Defaultdefault .

Mengembalikan

Indeks item berbasis nol dalam yang diurutkan List<T>, jika item ditemukan; jika tidak, angka negatif yang merupakan pelengkap bitwise dari indeks elemen berikutnya yang lebih besar dari atau, jika tidak ada elemen yang lebih item besar, pelengkap bitwise dari Count.

Pengecualian

index kurang dari 0.

-atau-

count kurang dari 0.

index dan count jangan menandakan rentang yang valid dalam List<T>.

comparer adalah null, dan pembanding Default default tidak dapat menemukan implementasi IComparable<T> antarmuka generik atau IComparable antarmuka untuk jenis T.

Contoh

Contoh berikut menunjukkan Sort(Int32, Int32, IComparer<T>) kelebihan beban metode dan BinarySearch(Int32, Int32, T, IComparer<T>) metode kelebihan beban.

Contoh mendefinisikan perbandingan alternatif untuk string bernama DinoCompare, yang mengimplementasikan IComparer<string> antarmuka generik (IComparer(Of String) di Visual Basic). Pembanding berfungsi sebagai berikut: Pertama, perbandingan diuji untuk null, dan referensi null diperlakukan kurang dari non-null. Kedua, panjang string dibandingkan, dan string yang lebih panjang dianggap lebih besar. Ketiga, jika panjangnya sama, perbandingan string biasa digunakan.

Sebuah List<T> string dibuat dan diisi dengan nama lima dinosang herbivora dan tiga dinosang karnivora. Dalam masing-masing dari dua grup, nama tidak dalam urutan pengurutan tertentu. Daftar ditampilkan, rentang herbivora diurutkan menggunakan pembanding alternatif, dan daftar ditampilkan lagi.

Metode BinarySearch(Int32, Int32, T, IComparer<T>) kelebihan beban kemudian digunakan untuk mencari hanya rentang herbivora untuk "Brachiosaurus". String tidak ditemukan, dan pelengkap bitwise (operator ~ di C#, Xor -1 di Visual Basic) dari angka negatif yang dikembalikan oleh BinarySearch(Int32, Int32, T, IComparer<T>) metode digunakan sebagai indeks untuk menyisipkan string baru.

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

Keterangan

Pembanding menyesuaikan bagaimana elemen dibandingkan. Misalnya, Anda dapat menggunakan CaseInsensitiveComparer instans sebagai pembanding untuk melakukan pencarian string yang tidak peka huruf besar/kecil.

Jika comparer disediakan, elemen List<T> dibandingkan dengan nilai yang ditentukan menggunakan implementasi yang ditentukan IComparer<T> .

Jika comparer adalah null, pembanding Comparer<T>.Default default memeriksa apakah jenis T mengimplementasikan antarmuka generik dan menggunakan implementasi tersebut IComparable<T> , jika tersedia. Jika tidak, Comparer<T>.Default memeriksa apakah jenis T mengimplementasikan IComparable antarmuka. Jika jenis T tidak mengimplementasikan salah satu antarmuka, Comparer<T>.Default melemparkan InvalidOperationException.

List<T> harus sudah diurutkan sesuai dengan implementasi pembanding; jika tidak, hasilnya salah.

Membandingkan null dengan jenis referensi apa pun diizinkan dan tidak menghasilkan pengecualian saat menggunakan IComparable<T> antarmuka generik. Saat mengurutkan, null dianggap kurang dari objek lainnya.

List<T> Jika berisi lebih dari satu elemen dengan nilai yang sama, metode hanya mengembalikan salah satu kemunculan, dan mungkin mengembalikan salah satu kemunculan, belum tentu yang pertama.

List<T> Jika tidak berisi nilai yang ditentukan, metode mengembalikan bilangan bulat negatif. Anda dapat menerapkan operasi pelengkap bitwise (~) ke bilangan bulat negatif ini untuk mendapatkan indeks elemen pertama yang lebih besar dari nilai pencarian. Saat menyisipkan nilai ke dalam List<T>, indeks ini harus digunakan sebagai titik penyisipan untuk mempertahankan urutan pengurutan.

Metode ini adalah operasi O(log n), di mana n adalah jumlah elemen dalam rentang.

Lihat juga

Berlaku untuk