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<TKey, TValue>-Methode: (TKey[], TValue[], IComparer<TKey>)

 

Veröffentlicht: Oktober 2016

Sortiert ein Paar von Array-Objekten (das eine enthält die Schlüssel und das andere die entsprechenden Werte) nach den Schlüsseln im ersten Array und verwendet dabei die angegebene generische IComparer<T>-Schnittstelle.

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

public static void Sort<TKey, TValue>(
	TKey[] keys,
	TValue[] items,
	IComparer<TKey> comparer
)

Parameter

keys
Type: TKey[]

Das eindimensionale nullbasierte Array mit den zu sortierenden Schlüsseln.

items
Type: TValue[]

Das eindimensionale nullbasierte Array, das die den Schlüsseln in keys entsprechenden Elemente enthält, oder null, um nur keys zu sortieren.

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

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

TKey

Der Typ der Elemente des Schlüsselarrays.

TValue

Der Typ der Elemente des Elementarrays.

Exception Condition
ArgumentNullException

keys ist null.

ArgumentException

items ist nicht null, und die Untergrenze von keys entspricht nicht der Untergrenze von items.

- oder -

items ist nicht null, und die Länge von keys ist größer als die Länge von items.

- 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 in keysArray ist die generische IComparable<T>-Schnittstelle nicht implementiert.

Jeder Schlüssel in der keysArray verfügt über ein entsprechendes Element in der itemsArray. Wenn ein Schlüssel positioniert wird, bei der Sortierung, des entsprechenden Elements in der itemsArray wird neu positioniert. Aus diesem Grund die itemsArray sortiert wird, gemäß der Anordnung der entsprechenden Schlüssel in der keysArray.

Wenn comparer ist null, die jeweils Schlüssel in der keysArray implementieren muss die IComparable<T> generischen Schnittstelle, die mit jedem anderen Schlüssel verglichen werden kann.

Sie können sortieren, wenn mehr Elemente als Schlüssel vorhanden sind, aber die Elemente, die ohne entsprechenden Schlüssel werden nicht sortiert. Wenn mehr Schlüssel als Elemente vorhanden sind, können nicht sortiert werden; Dies löst dies eine ArgumentException.

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

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

  • Wenn die Größe der Partition weniger als 16 Elemente ist, verwendet es einen insertion sort Algorithmus.

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

  • Andernfalls wird ein 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 mit dem Heapsort und Quicksort-Algorithmus, im schlimmsten Fall sortiert sind, ist diese Methode eine O (n Protokoll n)-Vorgang, in dem n ist der Length der array.

Hinweise für Aufrufer:

Der .NET Framework 4 und früheren Versionen verwendet den Quicksort-Algorithmus. QuickSort identifiziert ungültige Vergleiche in einigen Situationen, in dem der Sortiervorgang löst, eine IndexOutOfRangeException -Ausnahme aus, 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 Ausnahme nicht ausgelöst, da die Einfügung sortieren und Heapsort Algorithmen ein ungültiger Vergleich nicht erkennen. Dies gilt zum größten Teil für Arrays mit weniger als 16 Elemente.

Das folgende Codebeispiel veranschaulicht die Sort<TKey, TValue>(TKey[], TValue[]), Sort<TKey, TValue>(TKey[], TValue[], IComparer<TKey>),Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32), und Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) Überladungen der generischen Methode, für die Sortierung von Paaren von Arrays, die Schlüssel und Werte darstellen.

Im Codebeispiel wird einen alternativen Vergleich für Zeichenfolgen mit der Bezeichnung 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 zu vergleichenden Elemente umkehren, so dass die Zeichenfolgen hoch zu niedrig anstelle von niedrig zu hoch sortieren.

Das Codebeispiel erstellt und ein Array von Godzilla Namen (Schlüssel) und ein Array von ganzen Zahlen, die die maximale Länge der einzelnen Godzilla in Metern (die Werte) angezeigt. Die Arrays werden dann sortiert und mehrere Male angezeigt:

System_CAPS_noteHinweis

Die Aufrufe an den generischen Methoden suchen nicht anders als die Aufrufe ihrer nicht generischen Gegenstücke, da Visual Basic, c# und C++ den Typ des generischen Typparameters vom Typ der ersten beiden Argumente abzuleiten. 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 = {
            "Seismosaurus", 
            "Chasmosaurus", 
            "Coelophysis", 
            "Mamenchisaurus", 
            "Caudipteryx", 
            "Cetiosaurus"  };

        int[] dinosaurSizes = { 40, 5, 3, 22, 1, 18 };

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.", 
                dinosaurs[i], dinosaurSizes[i]);
        }

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

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.", 
                dinosaurs[i], dinosaurSizes[i]);
        }

        ReverseComparer rc = new ReverseComparer();

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

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.", 
                dinosaurs[i], dinosaurSizes[i]);
        }

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

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.", 
                dinosaurs[i], dinosaurSizes[i]);
        }

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

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.", 
                dinosaurs[i], dinosaurSizes[i]);
        }
    }
}

/* This code example produces the following output:

Seismosaurus: up to 40 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.

Sort(dinosaurs, dinosaurSizes)

Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Seismosaurus: up to 40 meters long.

Sort(dinosaurs, dinosaurSizes, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.
 */

Universelle Windows-Plattform
Verfügbar seit 10
.NET Framework
Verfügbar seit 2.0
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Zurück zum Anfang
Anzeigen: