(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.Sort<TKey, TValue>-Methode (TKey[], TValue[], Int32, Int32)

Sortiert einen Bereich von Elementen in einem 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 Implementierung der generischen IComparable<T>-Schnittstelle jedes Schlüssels.

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

public static void Sort<TKey, TValue>(
	TKey[] keys,
	TValue[] items,
	int index,
	int length
)

Typparameter

TKey

Der Typ der Elemente des Schlüsselarrays.

TValue

Der Typ der Elemente des Elementarrays.

Parameter

keys
Typ: TKey[]
Das eindimensionale nullbasierte Array mit den zu sortierenden Schlüsseln.
items
Typ: TValue[]
Das eindimensionale nullbasierte Array, das die den Schlüsseln in keys entsprechenden Elemente enthält, oder null, um nur keys zu sortieren.
index
Typ: System.Int32
Der Startindex des zu sortierenden Bereichs.
length
Typ: System.Int32
Die Anzahl der Elemente im zu sortierenden Bereich.

AusnahmeBedingung
ArgumentNullException

keys ist null.

ArgumentOutOfRangeException

index ist kleiner als die untere Grenze von keys.

- oder -

length ist kleiner als 0 (null).

ArgumentException

items ist nicht null, und die untere Grenze von keys entspricht nicht der unteren Grenze von items.

- oder -

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

- oder -

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

- oder -

items ist nicht null, und index und length geben keinen gültigen Bereich im itemsArray an.

InvalidOperationException

Mindestens ein Element im keysArray implementiert die generische IComparable<T>-Schnittstelle nicht.

Zu jedem Schlüssel im keys-Array ist ein entsprechendes Element im items-Array vorhanden. Wenn ein Schlüssel bei der Sortierung neu angeordnet wird, wird auch das entsprechende Element im items-Array neu positioniert. Daher wird das items-Array gemäß der Anordnung der entsprechenden Schlüssel im keys-Array sortiert.

Jeder Schlüssel im angegebenen Bereich von Elementen im keys-Array muss die generische IComparable<T>-Schnittstelle implementieren, damit er mit jedem anderen Schlüssel verglichen werden kann.

Sie können sortieren, wenn es mehr Elemente als Schlüssel gibt, aber Elemente ohne entsprechenden Schlüssel werden nicht sortiert. Sie können nicht sortieren, wenn es mehr Schlüssel als Elemente gibt. Hierbei wird eine ArgumentException ausgelöst.

Wenn der Sortiervorgang nicht erfolgreich abgeschlossen werden kann, ist das Ergebnis undefiniert.

Diese Methode verwendet den introspektiven Algorithmus der Sortierung (introsort), wie folgt:

  • Wenn die Partitionsgröße weniger als 16 Elemente ist, verwendet sie einen Einfügungssortierung Algorithmus.

  • Wenn die Anzahl der Partitionen 2 überschreitet * protokollieren Sie N, wobei N der Bereich des Eingabearrays ist, es verwendet einen Heapsort Algorithmus.

  • Andernfalls verwendet sie einen Quicksort Algorithmus.

Diese Implementierung führt eine instabile Sortierung durch, d. h., bei zwei gleichen Elementen wird die Reihenfolge möglicherweise nicht beibehalten. Bei einer stabilen Sortierung wird im Gegensatz dazu die Reihenfolge von gleichen Elementen beibehalten.

Für Arrays, die sortiert werden, indem das Heapsort verwendet und Quicksort-Algorithmen, im ungünstigsten Fall, diese Methode ein Vorgang zu O (n Protokoll n) ist n, length ist.

Im folgenden Codebeispiel werden die generischen Methodenüberladungen 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>) für das Sortieren von Paaren von Arrays veranschaulicht, die Schlüssel und Werte darstellen.

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.

Im Codebeispiel werden ein Array von Dinosauriernamen (die Schlüssel) erstellt und angezeigt sowie ein Array von Ganzzahlen, die die größte Länge der einzelnen Dinosaurier in Metern (die Werte) darstellen. Die Arrays werden dann sortiert und mehrere Male angezeigt:

HinweisHinweis

Aufrufe der generischen Methoden unterscheiden sich nicht von Aufrufen ihrer nicht generischen Entsprechungen, da der Typ des generischen Typparameters in Visual Basic, C# und C++ vom Typ der ersten beiden Argumente 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.


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


.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

.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