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.Sort<T>-Methode: (T[], Int32, Int32, IComparer<T>)

 

Veröffentlicht: Oktober 2016

Sortiert die Elemente in einem Bereich von Elementen im Array mithilfe der angegebenen generischen IComparer<T>-Schnittstelle.

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

public static void Sort<T>(
	T[] array,
	int index,
	int length,
	IComparer<T> comparer
)

Parameter

array
Type: T[]

Das zu sortierende eindimensionale und nullbasierte Array.

index
Type: System.Int32

Der Startindex des zu sortierenden Bereichs.

length
Type: System.Int32

Die Anzahl der Elemente im zu sortierenden Bereich.

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

Die Implementierung der generischen IComparer<T>-Schnittstelle, die für den Vergleich von Elementen verwendet werden soll, oder null, um die Implementierung der generischen IComparable<T>-Schnittstelle der einzelnen Elemente zu verwenden.

Typparameter

T

Der Typ der Elemente des Arrays.

Exception Condition
ArgumentNullException

array ist null.

ArgumentOutOfRangeException

index ist kleiner als die Untergrenze von array.

- oder -

length ist kleiner als Null.

ArgumentException

index und length geben keinen gültigen Bereich im array an.

- oder -

Die Implementierung von comparer hat einen Fehler während der Sortierung verursacht. Beispielsweise gibt comparer beim Vergleichen eines Elements mit sich selbst möglicherweise nicht 0 zurück.

InvalidOperationException

comparer ist null, und in einem oder mehreren Elementen im array ist die generische IComparable<T>-Schnittstelle nicht implementiert.

Wenn comparer ist null, jedes Element innerhalb des angegebenen Bereichs von Elementen in array implementieren müssen die IComparable<T> generische Schnittstelle kann Vergleiche mit jedem anderen Element im array.

Wenn die Sortierung nicht erfolgreich abgeschlossen wird, sind die Ergebnisse nicht definiert.

Diese Methode verwendet die introspective Sortieralgorithmus (Introsort) wie folgt aus:

  • Wenn die Partitionsgröße Elemente weniger als 16 ist, verwendet eine insertion sort Algorithmus.

  • Überschreitet die Anzahl der Partitionen 2 * LogN, wobei N ist der Bereich des Eingabearrays, verwendet er eine Heapsort Algorithmus.

  • Andernfalls wird eine Quicksort Algorithmus.

Diese Implementierung führt eine instabile Sortierung aus. Das heißt, dass die Reihenfolge gleicher Elemente unter Umständen nicht beibehalten werden kann. Im Gegensatz dazu behält eine stabile Sortierung die Reihenfolge der Elemente, die gleich sind.

Für Arrays, die mithilfe von Algorithmen Heapsort und Quicksort im schlimmsten Fall sortiert sind, ist diese Methode eine O (n Protokoll n) Vorgang, wobei n ist length.

Hinweise für Aufrufer:

Der .NET Framework 4 und früheren Versionen wird nur den Quicksort-Algorithmus verwendet. QuickSort identifiziert ungültige Vergleiche in einigen Situationen, in dem der Sortiervorgang löst, ein IndexOutOfRangeException Ausnahme und löst eine ArgumentException Ausnahme an den Aufrufer. Beginnend mit der .NET Framework 4.5, es ist möglich, dass ausgelöst, das zuvor Sortiervorgänge hat ArgumentException eine Ausnahme wird nicht ausgelöst werden, da die Algorithmen einfügen, Sortieren und Heapsort ein ungültiger Vergleich nicht erkennen. Dies gilt meistens, für Arrays mit weniger als 16 Elementen.

Das folgende Codebeispiel veranschaulicht die Sort<T>(T[], Int32, Int32) generischen methodenüberladung und die Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) generischen methodenüberladung für einen Bereich in einem Array zu sortieren.

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 Codebeispiel erstellt und zeigt ein Array von Dinosauriernamen, drei Pflanzenfresser und drei Fleischfresser (Tyrannosaurids, um genau zu sein). Die Sort<T>(T[], Int32, Int32) generischen methodenüberladung wird verwendet, um die letzten drei Elemente im Array zu sortieren, der dann angezeigt wird. Die Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) generischen methodenüberladung wird verwendet, mit ReverseCompare die letzten drei Elemente in umgekehrter Reihenfolge sortiert. Gründlich zu verwechseln Dinosaurier werden erneut angezeigt.

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.

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", 
                              "Mamenchisaurus", 
                              "Tarbosaurus",
                              "Tyrannosaurus", 
                              "Albertasaurus"};

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

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

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

        ReverseComparer rc = new ReverseComparer();

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

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

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Tarbosaurus
Tyrannosaurus
Albertasaurus

Sort(dinosaurs, 3, 3)

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Albertasaurus
Tarbosaurus
Tyrannosaurus

Sort(dinosaurs, 3, 3, rc)

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Tyrannosaurus
Tarbosaurus
Albertasaurus
 */

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: