Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Array.BinarySearch<T>-Methode: (T[], T, IComparer<T>)

 

Veröffentlicht: Juli 2016

Durchsucht ein ganzes sortiertes eindimensionales Array mithilfe der angegebenen generischen IComparer<T>-Schnittstelle nach einem Wert.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

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

Parameter

array
Type: T[]

Das zu durchsuchende sortierte eindimensionale und nullbasierte Array.

value
Type: T

Das Objekt, nach dem gesucht werden soll.

comparer
Type: System.Collections.Generic.IComparer<T>

Die IComparer<T>-Implementierung, die beim Vergleich von Elementen verwendet werden soll.

- oder -

null, wenn die IComparable<T>-Implementierung des jeweiligen Elements verwendet werden soll.

Rückgabewert

Type: System.Int32

Der Index des angegebenen value im angegebenen array, sofern value gefunden wurde, andernfalls eine negative Zahl. Wenn value nicht gefunden wurde und value kleiner als mindestens ein Element in array ist, entspricht die zurückgegebene negative Zahl dem bitweisen Komplement des Indexes des ersten Elements, das größer als value ist. Wenn value nicht gefunden wurde und value größer als alle Elemente in array ist, entspricht die zurückgegebene negative Zahl dem bitweisen Komplement (des Indexes des letzten Elements plus 1). Wenn diese Methode mit einem nicht sortierten array aufgerufen wird, kann der Rückgabewert falsch sein und selbst dann eine negative Zahl zurückgegeben werden, wenn value in array vorhanden ist.

Typparameter

T

Der Typ der Elemente des Arrays.

Exception Condition
ArgumentNullException

array ist null.

ArgumentException

comparer ist null und value verfügt über einen Typ, der nicht mit den Elementen von array kompatibel ist.

InvalidOperationException

comparer ist null und T implementiert die generische IComparable<T>-Schnittstelle nicht.

Diese Methode unterstützt keine Suchen von Arrays, die negative Indizes enthalten. arraymuss vor dem Aufrufen dieser Methode sortiert werden.

Wenn die Array enthält keinen den angegebenen Wert gibt die Methode eine negative ganze Zahl zurück. Sie können die bitweiser Komplementoperator anwenden (~ in c# Not in Visual Basic) auf das Ergebnis negativ, um einen Index zu erzeugen. Wenn dieser Index gleich der Größe des Arrays ist, befinden sich keine Elemente größer als value im Array. Andernfalls ist der Index des ersten Elements, das größer ist als value.

Der Vergleich wird bestimmt, wie die Elemente verglichen werden. Beispielsweise können Sie eine System.Collections.CaseInsensitiveComparer als Vergleich Groß-/Kleinschreibung Zeichenfolgensuche ausführen.

Wenn comparer nicht null, die Elemente der array verglichen werden, auf den angegebenen Wert mit dem angegebenen IComparer<T> generische Implementierung. Die Elemente der array muss bereits in das Erhöhen des Werts gemäß der Sortierreihenfolge von definierten sortiert werden comparerist, andernfalls das Ergebnis möglicherweise nicht korrekt.

Wenn comparer ist null, der Vergleich erfolgt mithilfe der IComparable<T> generische Implementierung von bereitgestellten T. Die Elemente der array muss bereits in das Erhöhen des Werts gemäß der Sortierreihenfolge von definierten sortiert werden die IComparable<T> Implementierung; anderenfalls das Ergebnis möglicherweise nicht korrekt.

System_CAPS_noteHinweis

Wenn comparer ist null und value implementiert nicht die IComparable<T> generische Schnittstelle, die Elemente der array nicht getestet werden IComparable<T> vor Beginn der Suche. Eine Ausnahme wird ausgelöst, wenn die Suche ein Element gefunden wird, die nicht implementiert IComparable<T>.

Doppelte Elemente sind zulässig. Wenn die Array enthält mehr als ein Element gleich value, die Methode gibt den Index nur ein vorkommen, aber nicht unbedingt das erste Schema zurück.

nullkann mit anderen Verweistypen immer verglichen werden. Daher geben Vergleiche mit null eine Ausnahme nicht generiert.

System_CAPS_noteHinweis

Für jedes Element getestet value übergeben wird, an die entsprechende IComparable<T> -Implementierung, auch wenn value ist null. D. h. die IComparable<T> Implementierung bestimmt, wie ein angegebenes Element zu vergleicht null.

Diese Methode ist eine O (Log n)-Vorgang, in dem n ist die Length von array.

Das folgende Beispiel veranschaulicht die Sort<T>(T[], IComparer<T>) generischen methodenüberladung und die BinarySearch<T>(T[], T, IComparer<T>) generischen methodenüberladung.

Im Codebeispiel wird einen alternativer Vergleich für Zeichenfolgen, die mit dem Namen definiert ReverseCompare, implementiert die IComparer<string> (IComparer(Of String) in Visual Basic IComparer<String^> in Visual C++) generische Schnittstelle. Der Vergleich ruft die CompareTo(String) -Methode, die Reihenfolge der verglichenen Elemente umkehren, sodass Zeichenfolgen hoch zu niedrig anstelle von niedrig zu hoch sortieren.

Das Array wird angezeigt, sortiert und erneut angezeigt. Arrays müssen sortiert werden, um mithilfe derBinarySearch<T> Methode.

System_CAPS_noteHinweis

Die Aufrufe an die Sort<T>(T[], IComparer<T>) und BinarySearch<T>(T[], T, IComparer<T>) generische Methoden nicht suchen alle Aufrufe an ihre nicht generischen Entsprechungen unterscheiden, da Visual Basic, c# und C++ den Typ des vom Typ des ersten Arguments der generischen Typparameter abgeleitet werden. Bei Verwendung der Ildasm.exe (IL Disassembler) um die Microsoft intermediate Language (MSIL) zu untersuchen, sehen Sie, dass die generischen Methoden aufgerufen werden.

Die BinarySearch<T>(T[], T, IComparer<T>) generischen methodenüberladung wird dann verwendet, um zwei Zeichenfolgen zu suchen, ist eine, die nicht in das Array und eine ist. Das Array und den Rückgabewert der BinarySearch<T>(T[], T, IComparer<T>) an die Methode übergeben werden die ShowWhere generische Methode, die den Indexwert zeigt an, wenn die Zeichenfolge gefunden wird, und andernfalls die Elemente die Suchzeichenfolge fallen würde zwischen wären im Array. Der Index ist negativ, wenn die Zeichenfolge nicht n ist das Array daher die ShowWhereMethode nimmt das bitweise Komplement (die ~ Operator in c# und Visual C++ Xor -1 in Visual Basic) um den Index des ersten Elements in der Liste zu erhalten, die größer ist als die zu suchende Zeichenfolge.

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 Main()
    {
        string[] dinosaurs = {"Pachycephalosaurus", 
                              "Amargasaurus", 
                              "Tyrannosaurus", 
                              "Mamenchisaurus", 
                              "Deinonychus", 
                              "Edmontosaurus"};

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

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort");
        Array.Sort(dinosaurs, rc);

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

        Console.WriteLine("\nBinarySearch for 'Coelophysis':");
        int index = Array.BinarySearch(dinosaurs, "Coelophysis", rc);
        ShowWhere(dinosaurs, index);

        Console.WriteLine("\nBinarySearch for 'Tyrannosaurus':");
        index = Array.BinarySearch(dinosaurs, "Tyrannosaurus", rc);
        ShowWhere(dinosaurs, index);
    }

    private static void ShowWhere<T>(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;

            Console.Write("Not found. Sorts between: ");

            if (index == 0)
                Console.Write("beginning of array and ");
            else
                Console.Write("{0} and ", array[index-1]);

            if (index == array.Length)
                Console.WriteLine("end of array.");
            else
                Console.WriteLine("{0}.", array[index]);
        }
        else
        {
            Console.WriteLine("Found at index {0}.", index);
        }
    }
}

/* 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.
 */

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 2.0
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: