(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

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

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

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

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

Typparameter

T

Der Typ der Elemente des Arrays.

Parameter

array
Typ: T[]
Das zu durchsuchende sortierte eindimensionale und nullbasierte Array.
value
Typ: T
Das Objekt, nach dem gesucht werden soll.
comparer
Typ: 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

Typ: System.Int32
Der Index des angegebenen value im angegebenen array, sofern value gefunden wurde. Wenn value nicht gefunden wurde und value kleiner als ein oder mehr Elemente in array ist, eine negative Zahl, die das bitweise Komplement des Index des ersten Elements darstellt, das größer als value ist. Eine negative Zahl, die das bitweise Komplement von Index des letzten Elements + 1 darstellt, wenn value nicht gefunden wurde und value größer als alle Elemente in array ist.

AusnahmeBedingung
ArgumentNullException

array ist null.

ArgumentException

comparer ist null, und der Typ von value ist nicht mit den Elementen von array kompatibel.

InvalidOperationException

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

Diese Methode unterstützt das Suchen von Arrays, die negative Indizes enthalten, nicht. array muss vor dem Aufrufen dieser Methode sortiert werden.

Wenn Array den angegebenen Wert nicht enthält, gibt die Methode eine negative ganze Zahl zurück. Sie können den bitweisen Komplementierungsoperator anwenden (| in C#, Not in Visual Basic) dem negativen Ergebnis, um eines Indexes zu erzeugen. Wenn dieser Index gleich der Größe des Arrays handelt, gibt es keine Elemente, die im Array größer sind als value. Andernfalls ist der Index des ersten Elements größer als value.

Der Vergleich bestimmt, wie die Elemente miteinander verglichen werden. Sie können z. B. einen System.Collections.CaseInsensitiveComparer als Comparer für die Suche nach Zeichenfolgen verwenden, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.

Wenn comparer nicht null ist, werden die Elemente von array unter Verwendung der angegebenen Implementierung der generischen IComparer<T>-Schnittstelle mit dem angegebenen Wert verglichen. Die Elemente von array müssen bereits gemäß der durch comparer definierten Sortierreihenfolge aufsteigend sortiert werden, da ansonsten das Ergebnis möglicherweise falsch ist.

Wenn comparernull ist, ist der Vergleich mit der generischen Schnittstellenimplementierung IComparable<T> ), die von T bereitgestellt wird. Die Elemente von array müssen bereits gemäß der durch die IComparable<T>-Implementierung definierten Sortierreihenfolge aufsteigend sortiert werden, da ansonsten das Ergebnis möglicherweise falsch ist.

HinweisHinweis

Wenn comparernull ist und value die generische IComparable<T>-Schnittstelle nicht implementiert, werden die Elemente in array vor Beginn der Suche nicht auf IComparable<T> geprüft. Eine Ausnahme wird ausgelöst, wenn die Suche ein Element findet, das IComparable<T> nicht implementiert.

Mehrfach vorkommende Elemente sind zulässig. Wenn Array mehrere Elemente enthält, die gleich value sind, gibt die Methode nur den Index eines Vorkommens zurück, das nicht unbedingt das erste sein muss.

null kann immer mit beliebigen Referenztypen verglichen werden. Daher generieren Vergleiche mit null keine Ausnahme.

HinweisHinweis

   Bei jedem geprüften Element wird value an die entsprechende IComparable<T>-Implementierung übergeben, auch wenn valuenull ist. Das heißt, die IComparable<T>-Implementierung bestimmt, wie ein bestimmtes Element mit null verglichen wird.

Diese Methode ist eine O(logn)-Operation, wobei n die Length von array ist.

Im folgenden Beispiel wird die generische Sort<T>(T[], IComparer<T>)-Methodenüberladung und die generische BinarySearch<T>(T[], T, IComparer<T>)-Methodenüberladung.

Im Codebeispiel wird das alternative Vergleichsverfahren ReverseCompare für Zeichenfolgen definiert, das die generische IComparer<string>-Schnittstelle (IComparer(Of String) in Visual Basic, IComparer<String^> in Visual C++) implementiert. Der Vergleich ruft die CompareTo(String)-Methode auf und kehrt die Reihenfolge der zu vergleichenden Elemente um, sodass die Zeichenfolgen vom höchsten zum niedrigsten Element und nicht umgekehrt sortiert werden.

Das Array wird angezeigt, sortiert und erneut angezeigt. Arrays müssen sortiert werden, um die BinarySearch-Methode zu verwenden.

HinweisHinweis

Aufrufe der generischen Sort<T>(T[], IComparer<T>)-Methode und BinarySearch<T>(T[], T, IComparer<T>)-Methode unterscheiden sich nicht von Aufrufen ihrer nicht generischen Entsprechungen, da der Typ des generischen Typparameters in Visual Basic, C# und C++ vom Typ des ersten Arguments abgeleitet wird. Wenn Sie mit dem Ildasm.exe (IL Disassembler) die MSIL (Microsoft Intermediate Language) untersuchen, stellen Sie fest, dass die generischen Methoden aufgerufen werden.

Die generische BinarySearch<T>(T[], T, IComparer<T>)-Methodenüberladung wird anschließend zum Suchen von zwei Zeichenfolgen verwendet, von denen eine im Array vorhanden ist, die andere jedoch nicht. Das Array und der Rückgabewert der BinarySearch<T>(T[], T, IComparer<T>)-Methode werden an die generische ShowWhere-Methode übergeben, die den Indexwert anzeigt, wenn die Zeichenfolge gefunden wurde. Andernfalls werden die Elemente angezeigt, zwischen denen das Suchergebnis liegen würde, wenn es im Array vorhanden wäre. Der Index ist negativ, wenn die Zeichenfolge nicht im Array vorhanden ist, sodass die ShowWhere-Methode das bitweise Komplement (den ~-Operator in C# und Visual C++, Xor -1 in Visual Basic) akzeptiert, um den Index des ersten Elements in der Liste abzurufen, das größer als die Suchzeichenfolge ist.


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


.NET Framework

Unterstützt in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

.NET für Windows Phone-Apps

Unterstützt in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft