Array.Sort Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee sorteert u de elementen in een eendimensionale matrix.
Overloads
| Name | Description |
|---|---|
| Sort(Array, Array, Int32, Int32, IComparer) |
Sorteert een reeks elementen in een paar eendimensionale Array objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van de opgegeven IComparer. |
| Sort(Array, Int32, Int32, IComparer) |
Sorteert de elementen in een reeks elementen in een eendimensionaal Array met behulp van de opgegeven IComparer. |
| Sort(Array, Array, Int32, Int32) |
Sorteert een reeks elementen in een paar eendimensionale Array objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van de IComparable implementatie van elke sleutel. |
| Sort(Array, Int32, Int32) |
Sorteert de elementen in een reeks elementen in een eendimensionaal Array met behulp van de IComparable implementatie van elk element van het Array. |
| Sort(Array, Array, IComparer) |
Sorteert een paar eendimensionale Array objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van de opgegeven IComparer. |
| Sort(Array, Array) |
Sorteert een paar eendimensionale Array objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van de IComparable implementatie van elke sleutel. |
| Sort(Array) |
Sorteert de elementen in een hele eendimensionale met Array behulp van de IComparable implementatie van elk element van het Array. |
| Sort(Array, IComparer) |
Sorteert de elementen in een eendimensionaal Array met behulp van de opgegeven IComparer. |
| Sort<T>(T[]) |
Sorteert de elementen in een geheel Array met behulp van de IComparable<T> algemene interface-implementatie van elk element van het Array. |
| Sort<T>(T[], IComparer<T>) |
Hiermee sorteert u de elementen in een Array met behulp van de opgegeven IComparer<T> algemene interface. |
| Sort<T>(T[], Comparison<T>) |
Hiermee sorteert u de elementen in een Array met behulp van de opgegeven Comparison<T>. |
| Sort<T>(T[], Int32, Int32) |
Sorteert de elementen in een reeks elementen in een Array met behulp van de IComparable<T> algemene interface-implementatie van elk element van het Array. |
| Sort<T>(T[], Int32, Int32, IComparer<T>) |
Hiermee sorteert u de elementen in een reeks elementen in een Array met behulp van de opgegeven IComparer<T> algemene interface. |
| Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) |
Hiermee sorteert u een reeks elementen in een paar objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van Array de opgegeven IComparer<T> algemene interface. |
| Sort<TKey,TValue>(TKey[], TValue[]) |
Hiermee sorteert u een paar objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van Array de IComparable<T> algemene interface-implementatie van elke sleutel. |
| Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>) |
Hiermee sorteert u een paar objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van Array de opgegeven IComparer<T> algemene interface. |
| Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32) |
Sorteert een reeks elementen in een paar objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van Array de IComparable<T> algemene interface-implementatie van elke sleutel. |
Sort(Array, Array, Int32, Int32, IComparer)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
public:
static void Sort(Array ^ keys, Array ^ items, int index, int length, System::Collections::IComparer ^ comparer);
public static void Sort(Array keys, Array items, int index, int length, System.Collections.IComparer comparer);
public static void Sort(Array keys, Array? items, int index, int length, System.Collections.IComparer? comparer);
static member Sort : Array * Array * int * int * System.Collections.IComparer -> unit
Public Shared Sub Sort (keys As Array, items As Array, index As Integer, length As Integer, comparer As IComparer)
Parameters
- items
- Array
De eendimensionale Array die de items bevat die overeenkomen met elk van de sleutels in de keysArray.
– of –
null om alleen de keysArray.
- index
- Int32
De beginindex van het bereik dat moet worden gesorteerd.
- length
- Int32
Het aantal elementen in het bereik dat moet worden gesorteerd.
- comparer
- IComparer
De IComparer implementatie die moet worden gebruikt bij het vergelijken van elementen.
– of –
null om de IComparable implementatie van elk element te gebruiken.
Uitzonderingen
keys is null.
index is kleiner dan de ondergrens van keys.
– of –
length is kleiner dan nul.
items is niet null, en de ondergrens keys komt niet overeen met de ondergrens van items.
– of –
items is niet null, en de lengte van keys is groter dan de lengte van items.
– of –
index en length geef geen geldig bereik op in de keysArray.
– of –
items is niet null, en indexlength geef geen geldig bereik op in de itemsArray.
– of –
De implementatie van de oorzaak van comparer een fout tijdens het sorteren. Bijvoorbeeld: comparer retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
comparer is nullen een of meer elementen in de keysArray interface implementeren niet IComparable .
Voorbeelden
In het volgende codevoorbeeld ziet u hoe u twee gekoppelde matrices sorteert waarbij de eerste matrix de sleutels bevat en de tweede matrix de waarden bevat. Sorteringen worden uitgevoerd met behulp van de standaard comparer en een aangepaste vergelijking waarmee de sorteervolgorde wordt omgekeerd. Houd er rekening mee dat het resultaat kan variëren, afhankelijk van de huidige CultureInfo.
using System;
using System.Collections;
public class SamplesArray {
public class myReverserClass : IComparer {
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
int IComparer.Compare( Object x, Object y ) {
return( (new CaseInsensitiveComparer()).Compare( y, x ) );
}
}
public static void Main() {
// Creates and initializes a new Array and a new custom comparer.
String[] myKeys = { "red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange" };
String[] myValues = { "strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe" };
IComparer myComparer = new myReverserClass();
// Displays the values of the Array.
Console.WriteLine( "The Array initially contains the following values:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts a section of the Array using the default comparer.
Array.Sort( myKeys, myValues, 1, 3 );
Console.WriteLine( "After sorting a section of the Array using the default comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort( myKeys, myValues, 1, 3, myComparer );
Console.WriteLine( "After sorting a section of the Array using the reverse case-insensitive comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts the entire Array using the default comparer.
Array.Sort( myKeys, myValues );
Console.WriteLine( "After sorting the entire Array using the default comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort( myKeys, myValues, myComparer );
Console.WriteLine( "After sorting the entire Array using the reverse case-insensitive comparer:" );
PrintKeysAndValues( myKeys, myValues );
}
public static void PrintKeysAndValues( String[] myKeys, String[] myValues ) {
for ( int i = 0; i < myKeys.Length; i++ ) {
Console.WriteLine( " {0,-10}: {1}", myKeys[i], myValues[i] );
}
Console.WriteLine();
}
}
/*
This code produces the following output.
The Array initially contains the following values:
red : strawberries
GREEN : PEARS
YELLOW : LIMES
BLUE : BERRIES
purple : grapes
black : olives
orange : cantaloupe
After sorting a section of the Array using the default comparer:
red : strawberries
BLUE : BERRIES
GREEN : PEARS
YELLOW : LIMES
purple : grapes
black : olives
orange : cantaloupe
After sorting a section of the Array using the reverse case-insensitive comparer:
red : strawberries
YELLOW : LIMES
GREEN : PEARS
BLUE : BERRIES
purple : grapes
black : olives
orange : cantaloupe
After sorting the entire Array using the default comparer:
black : olives
BLUE : BERRIES
GREEN : PEARS
orange : cantaloupe
purple : grapes
red : strawberries
YELLOW : LIMES
After sorting the entire Array using the reverse case-insensitive comparer:
YELLOW : LIMES
red : strawberries
purple : grapes
orange : cantaloupe
GREEN : PEARS
BLUE : BERRIES
black : olives
*/
open System
open System.Collections
type MyReverserClass() =
interface IComparer with
member _.Compare(x, y) =
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
CaseInsensitiveComparer().Compare(y, x)
let printKeysAndValues (myKeys: string []) (myValues: string []) =
for i = 0 to myKeys.Length - 1 do
printfn $" {myKeys[i],-10}: {myValues[i]}"
printfn ""
// Creates and initializes a new Array and a new custom comparer.
let myKeys = [| "red"; "GREEN"; "YELLOW"; "BLUE"; "purple"; "black"; "orange" |]
let myValues = [| "strawberries"; "PEARS"; "LIMES"; "BERRIES"; "grapes"; "olives"; "cantaloupe" |]
let myComparer = MyReverserClass()
// Displays the values of the Array.
printfn "The Array initially contains the following values:"
printKeysAndValues myKeys myValues
// Sorts a section of the Array using the default comparer.
Array.Sort(myKeys, myValues, 1, 3)
printfn "After sorting a section of the Array using the default comparer:"
printKeysAndValues myKeys myValues
// Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, 1, 3, myComparer)
printfn "After sorting a section of the Array using the reverse case-insensitive comparer:"
printKeysAndValues myKeys myValues
// Sorts the entire Array using the default comparer.
Array.Sort(myKeys, myValues)
printfn "After sorting the entire Array using the default comparer:"
printKeysAndValues myKeys myValues
// Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, myComparer)
printfn "After sorting the entire Array using the reverse case-insensitive comparer:"
printKeysAndValues myKeys myValues
// This code produces the following output.
// The Array initially contains the following values:
// red : strawberries
// GREEN : PEARS
// YELLOW : LIMES
// BLUE : BERRIES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting a section of the Array using the default comparer:
// red : strawberries
// BLUE : BERRIES
// GREEN : PEARS
// YELLOW : LIMES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting a section of the Array using the reverse case-insensitive comparer:
// red : strawberries
// YELLOW : LIMES
// GREEN : PEARS
// BLUE : BERRIES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting the entire Array using the default comparer:
// black : olives
// BLUE : BERRIES
// GREEN : PEARS
// orange : cantaloupe
// purple : grapes
// red : strawberries
// YELLOW : LIMES
//
// After sorting the entire Array using the reverse case-insensitive comparer:
// YELLOW : LIMES
// red : strawberries
// purple : grapes
// orange : cantaloupe
// GREEN : PEARS
// BLUE : BERRIES
// black : olives
Imports System.Collections
Public Class SamplesArray
Public Class myReverserClass
Implements IComparer
' Calls CaseInsensitiveComparer.Compare with the parameters reversed.
Function Compare(x As [Object], y As [Object]) As Integer _
Implements IComparer.Compare
Return New CaseInsensitiveComparer().Compare(y, x)
End Function 'IComparer.Compare
End Class
Public Shared Sub Main()
' Creates and initializes a new Array and a new custom comparer.
Dim myKeys As [String]() = {"red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange"}
Dim myValues As [String]() = {"strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe"}
Dim myComparer = New myReverserClass()
' Displays the values of the Array.
Console.WriteLine("The Array initially contains the following values:")
PrintKeysAndValues(myKeys, myValues)
' Sorts a section of the Array using the default comparer.
Array.Sort(myKeys, myValues, 1, 3)
Console.WriteLine("After sorting a section of the Array using the default comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, 1, 3, myComparer)
Console.WriteLine("After sorting a section of the Array using the reverse case-insensitive comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts the entire Array using the default comparer.
Array.Sort(myKeys, myValues)
Console.WriteLine("After sorting the entire Array using the default comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, myComparer)
Console.WriteLine("After sorting the entire Array using the reverse case-insensitive comparer:")
PrintKeysAndValues(myKeys, myValues)
End Sub
Public Shared Sub PrintKeysAndValues(myKeys() As [String], myValues() As [String])
Dim i As Integer
For i = 0 To myKeys.Length - 1
Console.WriteLine(" {0,-10}: {1}", myKeys(i), myValues(i))
Next i
Console.WriteLine()
End Sub
End Class
'This code produces the following output.
'
'The Array initially contains the following values:
' red : strawberries
' GREEN : PEARS
' YELLOW : LIMES
' BLUE : BERRIES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting a section of the Array using the default comparer:
' red : strawberries
' BLUE : BERRIES
' GREEN : PEARS
' YELLOW : LIMES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting a section of the Array using the reverse case-insensitive comparer:
' red : strawberries
' YELLOW : LIMES
' GREEN : PEARS
' BLUE : BERRIES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting the entire Array using the default comparer:
' black : olives
' BLUE : BERRIES
' GREEN : PEARS
' orange : cantaloupe
' purple : grapes
' red : strawberries
' YELLOW : LIMES
'
'After sorting the entire Array using the reverse case-insensitive comparer:
' YELLOW : LIMES
' red : strawberries
' purple : grapes
' orange : cantaloupe
' GREEN : PEARS
' BLUE : BERRIES
' black : olives
Opmerkingen
Elke sleutel in de keyssleutel heeft een bijbehorend item in de Arrayitems.Array Wanneer een sleutel tijdens de sortering wordt verplaatst, wordt het bijbehorende item in het itemsArray item op dezelfde manier verplaatst. Daarom wordt het itemsgesorteerd op basis van de rangschikking van de bijbehorende sleutels in de Arraykeys.Array
Als comparer dat het is null, moet elke sleutel binnen het opgegeven bereik van elementen in de keysArray interface de interface implementeren IComparable om vergelijkingen met elke andere sleutel mogelijk te maken.
U kunt sorteren als er meer items zijn dan sleutels, maar de items met geen bijbehorende sleutels worden niet gesorteerd. U kunt niet sorteren als er meer sleutels zijn dan items; Als je dit doet, gooit een ArgumentException.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
.NET bevat vooraf gedefinieerde IComparer implementaties die worden vermeld in de volgende tabel.
| Implementation | Beschrijving |
|---|---|
| System.Collections.CaseInsensitiveComparer | Vergelijkt twee objecten, maar voert een niet-hoofdlettergevoelige vergelijking van tekenreeksen uit. |
| Comparer.Default | Vergelijkt twee objecten met behulp van de sorteerconventies van de huidige cultuur. |
| Comparer.DefaultInvariant | Vergelijkt twee objecten met behulp van de sorteerconventies van de invariante cultuur. |
| Comparer<T>.Default | Vergelijkt twee objecten van het type T met behulp van de standaardsorteervolgorde van het type. |
U kunt ook aangepaste vergelijkingen ondersteunen door een exemplaar van uw eigen IComparer implementatie op te geven voor de comparer parameter. In het voorbeeld wordt dit uitgevoerd door een aangepaste IComparer implementatie te definiëren waarmee de standaardsortatievolgorde wordt omgekeerd en hoofdlettergevoelige tekenreeksvergelijkingen worden uitgevoerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is length.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Dit geldt voor het grootste deel voor matrices met minder dan of gelijk aan 16 elementen.
Zie ook
Van toepassing op
Sort(Array, Int32, Int32, IComparer)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
public:
static void Sort(Array ^ array, int index, int length, System::Collections::IComparer ^ comparer);
public static void Sort(Array array, int index, int length, System.Collections.IComparer comparer);
public static void Sort(Array array, int index, int length, System.Collections.IComparer? comparer);
static member Sort : Array * int * int * System.Collections.IComparer -> unit
Public Shared Sub Sort (array As Array, index As Integer, length As Integer, comparer As IComparer)
Parameters
- index
- Int32
De beginindex van het bereik dat moet worden gesorteerd.
- length
- Int32
Het aantal elementen in het bereik dat moet worden gesorteerd.
- comparer
- IComparer
De IComparer implementatie die moet worden gebruikt bij het vergelijken van elementen.
– of –
null om de IComparable implementatie van elk element te gebruiken.
Uitzonderingen
array is null.
array is multidimensionaal.
index is kleiner dan de ondergrens van array.
– of –
length is kleiner dan nul.
index en length geef geen geldig bereik op in array.
– of –
De implementatie van de oorzaak van comparer een fout tijdens het sorteren. Bijvoorbeeld: comparer retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
comparer is null, en een of meer elementen in array de IComparable interface niet implementeren.
Voorbeelden
In het volgende codevoorbeeld ziet u hoe u de waarden in een Array sorteerfunctie sorteert met behulp van de standaard-vergelijking en een aangepaste vergelijking waarmee de sorteervolgorde wordt omgekeerd. Houd er rekening mee dat het resultaat kan variëren, afhankelijk van de huidige CultureInfo.
using System;
using System.Collections;
public class ReverseComparer : IComparer
{
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
public int Compare(Object x, Object y)
{
return (new CaseInsensitiveComparer()).Compare(y, x );
}
}
public class Example
{
public static void Main()
{
// Create and initialize a new array.
String[] words = { "The", "QUICK", "BROWN", "FOX", "jumps",
"over", "the", "lazy", "dog" };
// Instantiate the reverse comparer.
IComparer revComparer = new ReverseComparer();
// Display the values of the array.
Console.WriteLine( "The original order of elements in the array:" );
DisplayValues(words);
// Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3);
Console.WriteLine( "After sorting elements 1-3 by using the default comparer:");
DisplayValues(words);
// Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer);
Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:");
DisplayValues(words);
// Sort the entire array using the default comparer.
Array.Sort(words);
Console.WriteLine( "After sorting the entire array by using the default comparer:");
DisplayValues(words);
// Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer);
Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:");
DisplayValues(words);
}
public static void DisplayValues(String[] arr)
{
for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
i++ ) {
Console.WriteLine( " [{0}] : {1}", i, arr[i] );
}
Console.WriteLine();
}
}
// The example displays the following output:
// The original order of elements in the array:
// [0] : The
// [1] : QUICK
// [2] : BROWN
// [3] : FOX
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the default comparer:
// [0] : The
// [1] : BROWN
// [2] : FOX
// [3] : QUICK
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the reverse case-insensitive comparer:
// [0] : The
// [1] : QUICK
// [2] : FOX
// [3] : BROWN
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting the entire array by using the default comparer:
// [0] : BROWN
// [1] : dog
// [2] : FOX
// [3] : jumps
// [4] : lazy
// [5] : over
// [6] : QUICK
// [7] : the
// [8] : The
//
// After sorting the entire array using the reverse case-insensitive comparer:
// [0] : the
// [1] : The
// [2] : QUICK
// [3] : over
// [4] : lazy
// [5] : jumps
// [6] : FOX
// [7] : dog
// [8] : BROWN
open System
open System.Collections
type ReverseComparer() =
interface IComparer with
member _.Compare(x, y) =
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
CaseInsensitiveComparer().Compare(y, x)
let displayValues (arr: string []) =
for i = 0 to arr.Length - 1 do
printfn $" [{i}] : {arr[i]}"
printfn ""
// Create and initialize a new array.
let words =
[| "The"; "QUICK"; "BROWN"; "FOX"; "jumps"
"over"; "the"; "lazy"; "dog" |]
// Instantiate the reverse comparer.
let revComparer = ReverseComparer()
// Display the values of the array.
printfn "The original order of elements in the array:"
displayValues words
// Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3)
printfn "After sorting elements 1-3 by using the default comparer:"
displayValues words
// Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer)
printfn "After sorting elements 1-3 by using the reverse case-insensitive comparer:"
displayValues words
// Sort the entire array using the default comparer.
Array.Sort words
printfn "After sorting the entire array by using the default comparer:"
displayValues words
// Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer)
printfn "After sorting the entire array using the reverse case-insensitive comparer:"
displayValues words
// The example displays the following output:
// The original order of elements in the array:
// [0] : The
// [1] : QUICK
// [2] : BROWN
// [3] : FOX
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the default comparer:
// [0] : The
// [1] : BROWN
// [2] : FOX
// [3] : QUICK
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the reverse case-insensitive comparer:
// [0] : The
// [1] : QUICK
// [2] : FOX
// [3] : BROWN
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting the entire array by using the default comparer:
// [0] : BROWN
// [1] : dog
// [2] : FOX
// [3] : jumps
// [4] : lazy
// [5] : over
// [6] : QUICK
// [7] : the
// [8] : The
//
// After sorting the entire array using the reverse case-insensitive comparer:
// [0] : the
// [1] : The
// [2] : QUICK
// [3] : over
// [4] : lazy
// [5] : jumps
// [6] : FOX
// [7] : dog
// [8] : BROWN
Imports System.Collections
Public Class ReverseComparer : Implements IComparer
' Call CaseInsensitiveComparer.Compare with the parameters reversed.
Function Compare(x As Object, y As Object) As Integer _
Implements IComparer.Compare
Return New CaseInsensitiveComparer().Compare(y, x)
End Function
End Class
Public Module Example
Public Sub Main()
' Create and initialize a new array.
Dim words() As String = { "The", "QUICK", "BROWN", "FOX", "jumps",
"over", "the", "lazy", "dog" }
' Instantiate a new custom comparer.
Dim revComparer As New ReverseComparer()
' Display the values of the array.
Console.WriteLine( "The original order of elements in the array:" )
DisplayValues(words)
' Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3)
Console.WriteLine( "After sorting elements 1-3 by using the default comparer:")
DisplayValues(words)
' Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer)
Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:")
DisplayValues(words)
' Sort the entire array using the default comparer.
Array.Sort(words)
Console.WriteLine( "After sorting the entire array by using the default comparer:")
DisplayValues(words)
' Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer)
Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:")
DisplayValues(words)
End Sub
Public Sub DisplayValues(arr() As String)
For i As Integer = arr.GetLowerBound(0) To arr.GetUpperBound(0)
Console.WriteLine(" [{0}] : {1}", i, arr(i))
Next
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
' The original order of elements in the array:
' [0] : The
' [1] : QUICK
' [2] : BROWN
' [3] : FOX
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting elements 1-3 by using the default comparer:
' [0] : The
' [1] : BROWN
' [2] : FOX
' [3] : QUICK
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting elements 1-3 by using the reverse case-insensitive comparer:
' [0] : The
' [1] : QUICK
' [2] : FOX
' [3] : BROWN
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting the entire array by using the default comparer:
' [0] : BROWN
' [1] : dog
' [2] : FOX
' [3] : jumps
' [4] : lazy
' [5] : over
' [6] : QUICK
' [7] : the
' [8] : The
'
' After sorting the entire array using the reverse case-insensitive comparer:
' [0] : the
' [1] : The
' [2] : QUICK
' [3] : over
' [4] : lazy
' [5] : jumps
' [6] : FOX
' [7] : dog
' [8] : BROWN
Opmerkingen
Als comparer dat het is null, moet elk element binnen het opgegeven bereik van elementen array de IComparable interface implementeren om vergelijkingen te kunnen maken met elk ander element in array.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
.NET bevat vooraf gedefinieerde IComparer implementaties die worden vermeld in de volgende tabel.
| Implementation | Beschrijving |
|---|---|
| System.Collections.CaseInsensitiveComparer | Vergelijkt twee objecten, maar voert een niet-hoofdlettergevoelige vergelijking van tekenreeksen uit. |
| Comparer.Default | Vergelijkt twee objecten met behulp van de sorteerconventies van de huidige cultuur. |
| Comparer.DefaultInvariant | Vergelijkt twee objecten met behulp van de sorteerconventies van de invariante cultuur. |
| Comparer<T>.Default | Vergelijkt twee objecten van het type T met behulp van de standaardsorteervolgorde van het type. |
U kunt ook aangepaste vergelijkingen ondersteunen door een exemplaar van uw eigen IComparer implementatie op te geven voor de comparer parameter. In het voorbeeld wordt dit uitgevoerd door een ReverseComparer klasse te definiëren waarmee de standaardsortatievolgorde voor exemplaren van een type wordt omgekeerd en een tekenreeksvergelijking wordt uitgevoerd die niet hoofdlettergevoelig is.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is length.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Dit geldt voor het grootste deel voor matrices met minder dan of gelijk aan 16 elementen.
Zie ook
Van toepassing op
Sort(Array, Array, Int32, Int32)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Sorteert een reeks elementen in een paar eendimensionale Array objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van de IComparable implementatie van elke sleutel.
public:
static void Sort(Array ^ keys, Array ^ items, int index, int length);
public static void Sort(Array keys, Array items, int index, int length);
public static void Sort(Array keys, Array? items, int index, int length);
static member Sort : Array * Array * int * int -> unit
Public Shared Sub Sort (keys As Array, items As Array, index As Integer, length As Integer)
Parameters
- items
- Array
De eendimensionale Array die de items bevat die overeenkomen met elk van de sleutels in de keysArray.
– of –
null om alleen de keysArray.
- index
- Int32
De beginindex van het bereik dat moet worden gesorteerd.
- length
- Int32
Het aantal elementen in het bereik dat moet worden gesorteerd.
Uitzonderingen
keys is null.
index is kleiner dan de ondergrens van keys.
– of –
length is kleiner dan nul.
items is niet null, en de lengte van keys is groter dan de lengte van items.
– of –
index en length geef geen geldig bereik op in de keysArray.
– of –
items is niet null, en indexlength geef geen geldig bereik op in de itemsArray.
Een of meer elementen in de keysArray interface implementeren IComparable niet.
Voorbeelden
In het volgende codevoorbeeld ziet u hoe u twee gekoppelde matrices sorteert waarbij de eerste matrix de sleutels bevat en de tweede matrix de waarden bevat. Sorteringen worden uitgevoerd met behulp van de standaard comparer en een aangepaste vergelijking waarmee de sorteervolgorde wordt omgekeerd. Houd er rekening mee dat het resultaat kan variëren, afhankelijk van de huidige CultureInfo.
using System;
using System.Collections;
public class SamplesArray {
public class myReverserClass : IComparer {
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
int IComparer.Compare( Object x, Object y ) {
return( (new CaseInsensitiveComparer()).Compare( y, x ) );
}
}
public static void Main() {
// Creates and initializes a new Array and a new custom comparer.
String[] myKeys = { "red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange" };
String[] myValues = { "strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe" };
IComparer myComparer = new myReverserClass();
// Displays the values of the Array.
Console.WriteLine( "The Array initially contains the following values:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts a section of the Array using the default comparer.
Array.Sort( myKeys, myValues, 1, 3 );
Console.WriteLine( "After sorting a section of the Array using the default comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort( myKeys, myValues, 1, 3, myComparer );
Console.WriteLine( "After sorting a section of the Array using the reverse case-insensitive comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts the entire Array using the default comparer.
Array.Sort( myKeys, myValues );
Console.WriteLine( "After sorting the entire Array using the default comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort( myKeys, myValues, myComparer );
Console.WriteLine( "After sorting the entire Array using the reverse case-insensitive comparer:" );
PrintKeysAndValues( myKeys, myValues );
}
public static void PrintKeysAndValues( String[] myKeys, String[] myValues ) {
for ( int i = 0; i < myKeys.Length; i++ ) {
Console.WriteLine( " {0,-10}: {1}", myKeys[i], myValues[i] );
}
Console.WriteLine();
}
}
/*
This code produces the following output.
The Array initially contains the following values:
red : strawberries
GREEN : PEARS
YELLOW : LIMES
BLUE : BERRIES
purple : grapes
black : olives
orange : cantaloupe
After sorting a section of the Array using the default comparer:
red : strawberries
BLUE : BERRIES
GREEN : PEARS
YELLOW : LIMES
purple : grapes
black : olives
orange : cantaloupe
After sorting a section of the Array using the reverse case-insensitive comparer:
red : strawberries
YELLOW : LIMES
GREEN : PEARS
BLUE : BERRIES
purple : grapes
black : olives
orange : cantaloupe
After sorting the entire Array using the default comparer:
black : olives
BLUE : BERRIES
GREEN : PEARS
orange : cantaloupe
purple : grapes
red : strawberries
YELLOW : LIMES
After sorting the entire Array using the reverse case-insensitive comparer:
YELLOW : LIMES
red : strawberries
purple : grapes
orange : cantaloupe
GREEN : PEARS
BLUE : BERRIES
black : olives
*/
open System
open System.Collections
type MyReverserClass() =
interface IComparer with
member _.Compare(x, y) =
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
CaseInsensitiveComparer().Compare(y, x)
let printKeysAndValues (myKeys: string []) (myValues: string []) =
for i = 0 to myKeys.Length - 1 do
printfn $" {myKeys[i],-10}: {myValues[i]}"
printfn ""
// Creates and initializes a new Array and a new custom comparer.
let myKeys = [| "red"; "GREEN"; "YELLOW"; "BLUE"; "purple"; "black"; "orange" |]
let myValues = [| "strawberries"; "PEARS"; "LIMES"; "BERRIES"; "grapes"; "olives"; "cantaloupe" |]
let myComparer = MyReverserClass()
// Displays the values of the Array.
printfn "The Array initially contains the following values:"
printKeysAndValues myKeys myValues
// Sorts a section of the Array using the default comparer.
Array.Sort(myKeys, myValues, 1, 3)
printfn "After sorting a section of the Array using the default comparer:"
printKeysAndValues myKeys myValues
// Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, 1, 3, myComparer)
printfn "After sorting a section of the Array using the reverse case-insensitive comparer:"
printKeysAndValues myKeys myValues
// Sorts the entire Array using the default comparer.
Array.Sort(myKeys, myValues)
printfn "After sorting the entire Array using the default comparer:"
printKeysAndValues myKeys myValues
// Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, myComparer)
printfn "After sorting the entire Array using the reverse case-insensitive comparer:"
printKeysAndValues myKeys myValues
// This code produces the following output.
// The Array initially contains the following values:
// red : strawberries
// GREEN : PEARS
// YELLOW : LIMES
// BLUE : BERRIES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting a section of the Array using the default comparer:
// red : strawberries
// BLUE : BERRIES
// GREEN : PEARS
// YELLOW : LIMES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting a section of the Array using the reverse case-insensitive comparer:
// red : strawberries
// YELLOW : LIMES
// GREEN : PEARS
// BLUE : BERRIES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting the entire Array using the default comparer:
// black : olives
// BLUE : BERRIES
// GREEN : PEARS
// orange : cantaloupe
// purple : grapes
// red : strawberries
// YELLOW : LIMES
//
// After sorting the entire Array using the reverse case-insensitive comparer:
// YELLOW : LIMES
// red : strawberries
// purple : grapes
// orange : cantaloupe
// GREEN : PEARS
// BLUE : BERRIES
// black : olives
Imports System.Collections
Public Class SamplesArray
Public Class myReverserClass
Implements IComparer
' Calls CaseInsensitiveComparer.Compare with the parameters reversed.
Function Compare(x As [Object], y As [Object]) As Integer _
Implements IComparer.Compare
Return New CaseInsensitiveComparer().Compare(y, x)
End Function 'IComparer.Compare
End Class
Public Shared Sub Main()
' Creates and initializes a new Array and a new custom comparer.
Dim myKeys As [String]() = {"red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange"}
Dim myValues As [String]() = {"strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe"}
Dim myComparer = New myReverserClass()
' Displays the values of the Array.
Console.WriteLine("The Array initially contains the following values:")
PrintKeysAndValues(myKeys, myValues)
' Sorts a section of the Array using the default comparer.
Array.Sort(myKeys, myValues, 1, 3)
Console.WriteLine("After sorting a section of the Array using the default comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, 1, 3, myComparer)
Console.WriteLine("After sorting a section of the Array using the reverse case-insensitive comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts the entire Array using the default comparer.
Array.Sort(myKeys, myValues)
Console.WriteLine("After sorting the entire Array using the default comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, myComparer)
Console.WriteLine("After sorting the entire Array using the reverse case-insensitive comparer:")
PrintKeysAndValues(myKeys, myValues)
End Sub
Public Shared Sub PrintKeysAndValues(myKeys() As [String], myValues() As [String])
Dim i As Integer
For i = 0 To myKeys.Length - 1
Console.WriteLine(" {0,-10}: {1}", myKeys(i), myValues(i))
Next i
Console.WriteLine()
End Sub
End Class
'This code produces the following output.
'
'The Array initially contains the following values:
' red : strawberries
' GREEN : PEARS
' YELLOW : LIMES
' BLUE : BERRIES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting a section of the Array using the default comparer:
' red : strawberries
' BLUE : BERRIES
' GREEN : PEARS
' YELLOW : LIMES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting a section of the Array using the reverse case-insensitive comparer:
' red : strawberries
' YELLOW : LIMES
' GREEN : PEARS
' BLUE : BERRIES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting the entire Array using the default comparer:
' black : olives
' BLUE : BERRIES
' GREEN : PEARS
' orange : cantaloupe
' purple : grapes
' red : strawberries
' YELLOW : LIMES
'
'After sorting the entire Array using the reverse case-insensitive comparer:
' YELLOW : LIMES
' red : strawberries
' purple : grapes
' orange : cantaloupe
' GREEN : PEARS
' BLUE : BERRIES
' black : olives
Opmerkingen
Elke sleutel in de keyssleutel heeft een bijbehorend item in de Arrayitems.Array Wanneer een sleutel tijdens de sortering wordt verplaatst, wordt het bijbehorende item in het itemsArray item op dezelfde manier verplaatst. Daarom wordt het itemsgesorteerd op basis van de rangschikking van de bijbehorende sleutels in de Arraykeys.Array
Elke sleutel binnen het opgegeven bereik van elementen in de keysArray interface moet de IComparable interface implementeren om vergelijkingen met elke andere sleutel mogelijk te maken.
U kunt sorteren als er meer items zijn dan sleutels, maar de items met geen bijbehorende sleutels worden niet gesorteerd. U kunt niet sorteren als er meer sleutels zijn dan items; Als je dit doet, gooit een ArgumentException.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is length.
Zie ook
Van toepassing op
Sort(Array, Int32, Int32)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Sorteert de elementen in een reeks elementen in een eendimensionaal Array met behulp van de IComparable implementatie van elk element van het Array.
public:
static void Sort(Array ^ array, int index, int length);
public static void Sort(Array array, int index, int length);
static member Sort : Array * int * int -> unit
Public Shared Sub Sort (array As Array, index As Integer, length As Integer)
Parameters
- index
- Int32
De beginindex van het bereik dat moet worden gesorteerd.
- length
- Int32
Het aantal elementen in het bereik dat moet worden gesorteerd.
Uitzonderingen
array is null.
array is multidimensionaal.
index is kleiner dan de ondergrens van array.
– of –
length is kleiner dan nul.
index en length geef geen geldig bereik op in array.
Een of meer elementen in de arrayIComparable interface implementeren niet.
Voorbeelden
In het volgende codevoorbeeld ziet u hoe u de waarden in een Array sorteerfunctie sorteert met behulp van de standaard-vergelijking en een aangepaste vergelijking waarmee de sorteervolgorde wordt omgekeerd. Houd er rekening mee dat het resultaat kan variëren, afhankelijk van de huidige CultureInfo.
using System;
using System.Collections;
public class ReverseComparer : IComparer
{
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
public int Compare(Object x, Object y)
{
return (new CaseInsensitiveComparer()).Compare(y, x );
}
}
public class Example
{
public static void Main()
{
// Create and initialize a new array.
String[] words = { "The", "QUICK", "BROWN", "FOX", "jumps",
"over", "the", "lazy", "dog" };
// Instantiate the reverse comparer.
IComparer revComparer = new ReverseComparer();
// Display the values of the array.
Console.WriteLine( "The original order of elements in the array:" );
DisplayValues(words);
// Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3);
Console.WriteLine( "After sorting elements 1-3 by using the default comparer:");
DisplayValues(words);
// Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer);
Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:");
DisplayValues(words);
// Sort the entire array using the default comparer.
Array.Sort(words);
Console.WriteLine( "After sorting the entire array by using the default comparer:");
DisplayValues(words);
// Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer);
Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:");
DisplayValues(words);
}
public static void DisplayValues(String[] arr)
{
for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
i++ ) {
Console.WriteLine( " [{0}] : {1}", i, arr[i] );
}
Console.WriteLine();
}
}
// The example displays the following output:
// The original order of elements in the array:
// [0] : The
// [1] : QUICK
// [2] : BROWN
// [3] : FOX
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the default comparer:
// [0] : The
// [1] : BROWN
// [2] : FOX
// [3] : QUICK
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the reverse case-insensitive comparer:
// [0] : The
// [1] : QUICK
// [2] : FOX
// [3] : BROWN
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting the entire array by using the default comparer:
// [0] : BROWN
// [1] : dog
// [2] : FOX
// [3] : jumps
// [4] : lazy
// [5] : over
// [6] : QUICK
// [7] : the
// [8] : The
//
// After sorting the entire array using the reverse case-insensitive comparer:
// [0] : the
// [1] : The
// [2] : QUICK
// [3] : over
// [4] : lazy
// [5] : jumps
// [6] : FOX
// [7] : dog
// [8] : BROWN
open System
open System.Collections
type ReverseComparer() =
interface IComparer with
member _.Compare(x, y) =
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
CaseInsensitiveComparer().Compare(y, x)
let displayValues (arr: string []) =
for i = 0 to arr.Length - 1 do
printfn $" [{i}] : {arr[i]}"
printfn ""
// Create and initialize a new array.
let words =
[| "The"; "QUICK"; "BROWN"; "FOX"; "jumps"
"over"; "the"; "lazy"; "dog" |]
// Instantiate the reverse comparer.
let revComparer = ReverseComparer()
// Display the values of the array.
printfn "The original order of elements in the array:"
displayValues words
// Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3)
printfn "After sorting elements 1-3 by using the default comparer:"
displayValues words
// Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer)
printfn "After sorting elements 1-3 by using the reverse case-insensitive comparer:"
displayValues words
// Sort the entire array using the default comparer.
Array.Sort words
printfn "After sorting the entire array by using the default comparer:"
displayValues words
// Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer)
printfn "After sorting the entire array using the reverse case-insensitive comparer:"
displayValues words
// The example displays the following output:
// The original order of elements in the array:
// [0] : The
// [1] : QUICK
// [2] : BROWN
// [3] : FOX
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the default comparer:
// [0] : The
// [1] : BROWN
// [2] : FOX
// [3] : QUICK
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the reverse case-insensitive comparer:
// [0] : The
// [1] : QUICK
// [2] : FOX
// [3] : BROWN
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting the entire array by using the default comparer:
// [0] : BROWN
// [1] : dog
// [2] : FOX
// [3] : jumps
// [4] : lazy
// [5] : over
// [6] : QUICK
// [7] : the
// [8] : The
//
// After sorting the entire array using the reverse case-insensitive comparer:
// [0] : the
// [1] : The
// [2] : QUICK
// [3] : over
// [4] : lazy
// [5] : jumps
// [6] : FOX
// [7] : dog
// [8] : BROWN
Imports System.Collections
Public Class ReverseComparer : Implements IComparer
' Call CaseInsensitiveComparer.Compare with the parameters reversed.
Function Compare(x As Object, y As Object) As Integer _
Implements IComparer.Compare
Return New CaseInsensitiveComparer().Compare(y, x)
End Function
End Class
Public Module Example
Public Sub Main()
' Create and initialize a new array.
Dim words() As String = { "The", "QUICK", "BROWN", "FOX", "jumps",
"over", "the", "lazy", "dog" }
' Instantiate a new custom comparer.
Dim revComparer As New ReverseComparer()
' Display the values of the array.
Console.WriteLine( "The original order of elements in the array:" )
DisplayValues(words)
' Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3)
Console.WriteLine( "After sorting elements 1-3 by using the default comparer:")
DisplayValues(words)
' Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer)
Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:")
DisplayValues(words)
' Sort the entire array using the default comparer.
Array.Sort(words)
Console.WriteLine( "After sorting the entire array by using the default comparer:")
DisplayValues(words)
' Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer)
Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:")
DisplayValues(words)
End Sub
Public Sub DisplayValues(arr() As String)
For i As Integer = arr.GetLowerBound(0) To arr.GetUpperBound(0)
Console.WriteLine(" [{0}] : {1}", i, arr(i))
Next
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
' The original order of elements in the array:
' [0] : The
' [1] : QUICK
' [2] : BROWN
' [3] : FOX
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting elements 1-3 by using the default comparer:
' [0] : The
' [1] : BROWN
' [2] : FOX
' [3] : QUICK
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting elements 1-3 by using the reverse case-insensitive comparer:
' [0] : The
' [1] : QUICK
' [2] : FOX
' [3] : BROWN
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting the entire array by using the default comparer:
' [0] : BROWN
' [1] : dog
' [2] : FOX
' [3] : jumps
' [4] : lazy
' [5] : over
' [6] : QUICK
' [7] : the
' [8] : The
'
' After sorting the entire array using the reverse case-insensitive comparer:
' [0] : the
' [1] : The
' [2] : QUICK
' [3] : over
' [4] : lazy
' [5] : jumps
' [6] : FOX
' [7] : dog
' [8] : BROWN
Opmerkingen
Elk element binnen het opgegeven bereik van elementen in array moet de IComparable interface implementeren om vergelijkingen met elk ander element in arrayte kunnen voeren.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is length.
Zie ook
Van toepassing op
Sort(Array, Array, IComparer)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
public:
static void Sort(Array ^ keys, Array ^ items, System::Collections::IComparer ^ comparer);
public static void Sort(Array keys, Array items, System.Collections.IComparer comparer);
public static void Sort(Array keys, Array? items, System.Collections.IComparer? comparer);
static member Sort : Array * Array * System.Collections.IComparer -> unit
Public Shared Sub Sort (keys As Array, items As Array, comparer As IComparer)
Parameters
- items
- Array
De eendimensionale Array die de items bevat die overeenkomen met elk van de sleutels in de keysArray.
– of –
null om alleen de keysArray.
- comparer
- IComparer
De IComparer implementatie die moet worden gebruikt bij het vergelijken van elementen.
– of –
null om de IComparable implementatie van elk element te gebruiken.
Uitzonderingen
keys is null.
items is niet null, en de lengte van keys is groter dan de lengte van items.
– of –
De implementatie van de oorzaak van comparer een fout tijdens het sorteren. Bijvoorbeeld: comparer retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
comparer is nullen een of meer elementen in de keysArray interface implementeren niet IComparable .
Voorbeelden
In het volgende voorbeeld ziet u hoe u twee gekoppelde matrices sorteert waarbij de eerste matrix de sleutels bevat en de tweede matrix de waarden bevat. Sorteringen worden uitgevoerd met behulp van de standaard comparer en een aangepaste vergelijking waarmee de sorteervolgorde wordt omgekeerd. Houd er rekening mee dat het resultaat kan variëren, afhankelijk van de huidige CultureInfo.
using System;
using System.Collections;
public class SamplesArray {
public class myReverserClass : IComparer {
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
int IComparer.Compare( Object x, Object y ) {
return( (new CaseInsensitiveComparer()).Compare( y, x ) );
}
}
public static void Main() {
// Creates and initializes a new Array and a new custom comparer.
String[] myKeys = { "red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange" };
String[] myValues = { "strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe" };
IComparer myComparer = new myReverserClass();
// Displays the values of the Array.
Console.WriteLine( "The Array initially contains the following values:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts a section of the Array using the default comparer.
Array.Sort( myKeys, myValues, 1, 3 );
Console.WriteLine( "After sorting a section of the Array using the default comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort( myKeys, myValues, 1, 3, myComparer );
Console.WriteLine( "After sorting a section of the Array using the reverse case-insensitive comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts the entire Array using the default comparer.
Array.Sort( myKeys, myValues );
Console.WriteLine( "After sorting the entire Array using the default comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort( myKeys, myValues, myComparer );
Console.WriteLine( "After sorting the entire Array using the reverse case-insensitive comparer:" );
PrintKeysAndValues( myKeys, myValues );
}
public static void PrintKeysAndValues( String[] myKeys, String[] myValues ) {
for ( int i = 0; i < myKeys.Length; i++ ) {
Console.WriteLine( " {0,-10}: {1}", myKeys[i], myValues[i] );
}
Console.WriteLine();
}
}
/*
This code produces the following output.
The Array initially contains the following values:
red : strawberries
GREEN : PEARS
YELLOW : LIMES
BLUE : BERRIES
purple : grapes
black : olives
orange : cantaloupe
After sorting a section of the Array using the default comparer:
red : strawberries
BLUE : BERRIES
GREEN : PEARS
YELLOW : LIMES
purple : grapes
black : olives
orange : cantaloupe
After sorting a section of the Array using the reverse case-insensitive comparer:
red : strawberries
YELLOW : LIMES
GREEN : PEARS
BLUE : BERRIES
purple : grapes
black : olives
orange : cantaloupe
After sorting the entire Array using the default comparer:
black : olives
BLUE : BERRIES
GREEN : PEARS
orange : cantaloupe
purple : grapes
red : strawberries
YELLOW : LIMES
After sorting the entire Array using the reverse case-insensitive comparer:
YELLOW : LIMES
red : strawberries
purple : grapes
orange : cantaloupe
GREEN : PEARS
BLUE : BERRIES
black : olives
*/
open System
open System.Collections
type MyReverserClass() =
interface IComparer with
member _.Compare(x, y) =
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
CaseInsensitiveComparer().Compare(y, x)
let printKeysAndValues (myKeys: string []) (myValues: string []) =
for i = 0 to myKeys.Length - 1 do
printfn $" {myKeys[i],-10}: {myValues[i]}"
printfn ""
// Creates and initializes a new Array and a new custom comparer.
let myKeys = [| "red"; "GREEN"; "YELLOW"; "BLUE"; "purple"; "black"; "orange" |]
let myValues = [| "strawberries"; "PEARS"; "LIMES"; "BERRIES"; "grapes"; "olives"; "cantaloupe" |]
let myComparer = MyReverserClass()
// Displays the values of the Array.
printfn "The Array initially contains the following values:"
printKeysAndValues myKeys myValues
// Sorts a section of the Array using the default comparer.
Array.Sort(myKeys, myValues, 1, 3)
printfn "After sorting a section of the Array using the default comparer:"
printKeysAndValues myKeys myValues
// Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, 1, 3, myComparer)
printfn "After sorting a section of the Array using the reverse case-insensitive comparer:"
printKeysAndValues myKeys myValues
// Sorts the entire Array using the default comparer.
Array.Sort(myKeys, myValues)
printfn "After sorting the entire Array using the default comparer:"
printKeysAndValues myKeys myValues
// Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, myComparer)
printfn "After sorting the entire Array using the reverse case-insensitive comparer:"
printKeysAndValues myKeys myValues
// This code produces the following output.
// The Array initially contains the following values:
// red : strawberries
// GREEN : PEARS
// YELLOW : LIMES
// BLUE : BERRIES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting a section of the Array using the default comparer:
// red : strawberries
// BLUE : BERRIES
// GREEN : PEARS
// YELLOW : LIMES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting a section of the Array using the reverse case-insensitive comparer:
// red : strawberries
// YELLOW : LIMES
// GREEN : PEARS
// BLUE : BERRIES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting the entire Array using the default comparer:
// black : olives
// BLUE : BERRIES
// GREEN : PEARS
// orange : cantaloupe
// purple : grapes
// red : strawberries
// YELLOW : LIMES
//
// After sorting the entire Array using the reverse case-insensitive comparer:
// YELLOW : LIMES
// red : strawberries
// purple : grapes
// orange : cantaloupe
// GREEN : PEARS
// BLUE : BERRIES
// black : olives
Imports System.Collections
Public Class SamplesArray
Public Class myReverserClass
Implements IComparer
' Calls CaseInsensitiveComparer.Compare with the parameters reversed.
Function Compare(x As [Object], y As [Object]) As Integer _
Implements IComparer.Compare
Return New CaseInsensitiveComparer().Compare(y, x)
End Function 'IComparer.Compare
End Class
Public Shared Sub Main()
' Creates and initializes a new Array and a new custom comparer.
Dim myKeys As [String]() = {"red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange"}
Dim myValues As [String]() = {"strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe"}
Dim myComparer = New myReverserClass()
' Displays the values of the Array.
Console.WriteLine("The Array initially contains the following values:")
PrintKeysAndValues(myKeys, myValues)
' Sorts a section of the Array using the default comparer.
Array.Sort(myKeys, myValues, 1, 3)
Console.WriteLine("After sorting a section of the Array using the default comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, 1, 3, myComparer)
Console.WriteLine("After sorting a section of the Array using the reverse case-insensitive comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts the entire Array using the default comparer.
Array.Sort(myKeys, myValues)
Console.WriteLine("After sorting the entire Array using the default comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, myComparer)
Console.WriteLine("After sorting the entire Array using the reverse case-insensitive comparer:")
PrintKeysAndValues(myKeys, myValues)
End Sub
Public Shared Sub PrintKeysAndValues(myKeys() As [String], myValues() As [String])
Dim i As Integer
For i = 0 To myKeys.Length - 1
Console.WriteLine(" {0,-10}: {1}", myKeys(i), myValues(i))
Next i
Console.WriteLine()
End Sub
End Class
'This code produces the following output.
'
'The Array initially contains the following values:
' red : strawberries
' GREEN : PEARS
' YELLOW : LIMES
' BLUE : BERRIES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting a section of the Array using the default comparer:
' red : strawberries
' BLUE : BERRIES
' GREEN : PEARS
' YELLOW : LIMES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting a section of the Array using the reverse case-insensitive comparer:
' red : strawberries
' YELLOW : LIMES
' GREEN : PEARS
' BLUE : BERRIES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting the entire Array using the default comparer:
' black : olives
' BLUE : BERRIES
' GREEN : PEARS
' orange : cantaloupe
' purple : grapes
' red : strawberries
' YELLOW : LIMES
'
'After sorting the entire Array using the reverse case-insensitive comparer:
' YELLOW : LIMES
' red : strawberries
' purple : grapes
' orange : cantaloupe
' GREEN : PEARS
' BLUE : BERRIES
' black : olives
Opmerkingen
Elke sleutel in de keyssleutel heeft een bijbehorend item in de Arrayitems.Array Wanneer een sleutel tijdens de sortering wordt verplaatst, wordt het bijbehorende item in het itemsArray item op dezelfde manier verplaatst. Daarom wordt het itemsgesorteerd op basis van de rangschikking van de bijbehorende sleutels in de Arraykeys.Array
Als comparer dat het is null, moet elke sleutel in de keysArray interface de IComparable interface implementeren om vergelijkingen met elke andere sleutel mogelijk te maken.
U kunt sorteren als er meer items zijn dan sleutels, maar de items met geen bijbehorende sleutels worden niet gesorteerd. U kunt niet sorteren als er meer sleutels zijn dan items; Als je dit doet, gooit een ArgumentException.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
.NET bevat vooraf gedefinieerde IComparer implementaties die worden vermeld in de volgende tabel.
| Implementation | Beschrijving |
|---|---|
| System.Collections.CaseInsensitiveComparer | Vergelijkt twee objecten, maar voert een niet-hoofdlettergevoelige vergelijking van tekenreeksen uit. |
| Comparer.Default | Vergelijkt twee objecten met behulp van de sorteerconventies van de huidige cultuur. |
| Comparer.DefaultInvariant | Vergelijkt twee objecten met behulp van de sorteerconventies van de invariante cultuur. |
| Comparer<T>.Default | Vergelijkt twee objecten van het type T met behulp van de standaardsorteervolgorde van het type. |
U kunt ook aangepaste vergelijkingen ondersteunen door een exemplaar van uw eigen IComparer implementatie op te geven voor de comparer parameter. In het voorbeeld wordt dit uitgevoerd door een IComparer implementatie te definiëren waarmee de standaardsortatievolgorde wordt omgekeerd en een tekenreeksvergelijking wordt uitgevoerd die niet hoofdlettergevoelig is.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van keys.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Dit geldt voor het grootste deel voor matrices met minder dan of gelijk aan 16 elementen.
Zie ook
Van toepassing op
Sort(Array, Array)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Sorteert een paar eendimensionale Array objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van de IComparable implementatie van elke sleutel.
public:
static void Sort(Array ^ keys, Array ^ items);
public static void Sort(Array keys, Array items);
public static void Sort(Array keys, Array? items);
static member Sort : Array * Array -> unit
Public Shared Sub Sort (keys As Array, items As Array)
Parameters
- items
- Array
De eendimensionale Array die de items bevat die overeenkomen met elk van de sleutels in de keysArray.
– of –
null om alleen de keysArray.
Uitzonderingen
keys is null.
items is niet null, en de lengte van keys is groter dan de lengte van items.
Een of meer elementen in de keysArray interface implementeren IComparable niet.
Voorbeelden
In het volgende voorbeeld ziet u hoe u twee gekoppelde matrices sorteert waarbij de eerste matrix de sleutels bevat en de tweede matrix de waarden bevat. Sorteringen worden uitgevoerd met behulp van de standaard comparer en een aangepaste vergelijking waarmee de sorteervolgorde wordt omgekeerd. Houd er rekening mee dat het resultaat kan variëren, afhankelijk van de huidige CultureInfo.
using System;
using System.Collections;
public class SamplesArray {
public class myReverserClass : IComparer {
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
int IComparer.Compare( Object x, Object y ) {
return( (new CaseInsensitiveComparer()).Compare( y, x ) );
}
}
public static void Main() {
// Creates and initializes a new Array and a new custom comparer.
String[] myKeys = { "red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange" };
String[] myValues = { "strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe" };
IComparer myComparer = new myReverserClass();
// Displays the values of the Array.
Console.WriteLine( "The Array initially contains the following values:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts a section of the Array using the default comparer.
Array.Sort( myKeys, myValues, 1, 3 );
Console.WriteLine( "After sorting a section of the Array using the default comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort( myKeys, myValues, 1, 3, myComparer );
Console.WriteLine( "After sorting a section of the Array using the reverse case-insensitive comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts the entire Array using the default comparer.
Array.Sort( myKeys, myValues );
Console.WriteLine( "After sorting the entire Array using the default comparer:" );
PrintKeysAndValues( myKeys, myValues );
// Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort( myKeys, myValues, myComparer );
Console.WriteLine( "After sorting the entire Array using the reverse case-insensitive comparer:" );
PrintKeysAndValues( myKeys, myValues );
}
public static void PrintKeysAndValues( String[] myKeys, String[] myValues ) {
for ( int i = 0; i < myKeys.Length; i++ ) {
Console.WriteLine( " {0,-10}: {1}", myKeys[i], myValues[i] );
}
Console.WriteLine();
}
}
/*
This code produces the following output.
The Array initially contains the following values:
red : strawberries
GREEN : PEARS
YELLOW : LIMES
BLUE : BERRIES
purple : grapes
black : olives
orange : cantaloupe
After sorting a section of the Array using the default comparer:
red : strawberries
BLUE : BERRIES
GREEN : PEARS
YELLOW : LIMES
purple : grapes
black : olives
orange : cantaloupe
After sorting a section of the Array using the reverse case-insensitive comparer:
red : strawberries
YELLOW : LIMES
GREEN : PEARS
BLUE : BERRIES
purple : grapes
black : olives
orange : cantaloupe
After sorting the entire Array using the default comparer:
black : olives
BLUE : BERRIES
GREEN : PEARS
orange : cantaloupe
purple : grapes
red : strawberries
YELLOW : LIMES
After sorting the entire Array using the reverse case-insensitive comparer:
YELLOW : LIMES
red : strawberries
purple : grapes
orange : cantaloupe
GREEN : PEARS
BLUE : BERRIES
black : olives
*/
open System
open System.Collections
type MyReverserClass() =
interface IComparer with
member _.Compare(x, y) =
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
CaseInsensitiveComparer().Compare(y, x)
let printKeysAndValues (myKeys: string []) (myValues: string []) =
for i = 0 to myKeys.Length - 1 do
printfn $" {myKeys[i],-10}: {myValues[i]}"
printfn ""
// Creates and initializes a new Array and a new custom comparer.
let myKeys = [| "red"; "GREEN"; "YELLOW"; "BLUE"; "purple"; "black"; "orange" |]
let myValues = [| "strawberries"; "PEARS"; "LIMES"; "BERRIES"; "grapes"; "olives"; "cantaloupe" |]
let myComparer = MyReverserClass()
// Displays the values of the Array.
printfn "The Array initially contains the following values:"
printKeysAndValues myKeys myValues
// Sorts a section of the Array using the default comparer.
Array.Sort(myKeys, myValues, 1, 3)
printfn "After sorting a section of the Array using the default comparer:"
printKeysAndValues myKeys myValues
// Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, 1, 3, myComparer)
printfn "After sorting a section of the Array using the reverse case-insensitive comparer:"
printKeysAndValues myKeys myValues
// Sorts the entire Array using the default comparer.
Array.Sort(myKeys, myValues)
printfn "After sorting the entire Array using the default comparer:"
printKeysAndValues myKeys myValues
// Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, myComparer)
printfn "After sorting the entire Array using the reverse case-insensitive comparer:"
printKeysAndValues myKeys myValues
// This code produces the following output.
// The Array initially contains the following values:
// red : strawberries
// GREEN : PEARS
// YELLOW : LIMES
// BLUE : BERRIES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting a section of the Array using the default comparer:
// red : strawberries
// BLUE : BERRIES
// GREEN : PEARS
// YELLOW : LIMES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting a section of the Array using the reverse case-insensitive comparer:
// red : strawberries
// YELLOW : LIMES
// GREEN : PEARS
// BLUE : BERRIES
// purple : grapes
// black : olives
// orange : cantaloupe
//
// After sorting the entire Array using the default comparer:
// black : olives
// BLUE : BERRIES
// GREEN : PEARS
// orange : cantaloupe
// purple : grapes
// red : strawberries
// YELLOW : LIMES
//
// After sorting the entire Array using the reverse case-insensitive comparer:
// YELLOW : LIMES
// red : strawberries
// purple : grapes
// orange : cantaloupe
// GREEN : PEARS
// BLUE : BERRIES
// black : olives
Imports System.Collections
Public Class SamplesArray
Public Class myReverserClass
Implements IComparer
' Calls CaseInsensitiveComparer.Compare with the parameters reversed.
Function Compare(x As [Object], y As [Object]) As Integer _
Implements IComparer.Compare
Return New CaseInsensitiveComparer().Compare(y, x)
End Function 'IComparer.Compare
End Class
Public Shared Sub Main()
' Creates and initializes a new Array and a new custom comparer.
Dim myKeys As [String]() = {"red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange"}
Dim myValues As [String]() = {"strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe"}
Dim myComparer = New myReverserClass()
' Displays the values of the Array.
Console.WriteLine("The Array initially contains the following values:")
PrintKeysAndValues(myKeys, myValues)
' Sorts a section of the Array using the default comparer.
Array.Sort(myKeys, myValues, 1, 3)
Console.WriteLine("After sorting a section of the Array using the default comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts a section of the Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, 1, 3, myComparer)
Console.WriteLine("After sorting a section of the Array using the reverse case-insensitive comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts the entire Array using the default comparer.
Array.Sort(myKeys, myValues)
Console.WriteLine("After sorting the entire Array using the default comparer:")
PrintKeysAndValues(myKeys, myValues)
' Sorts the entire Array using the reverse case-insensitive comparer.
Array.Sort(myKeys, myValues, myComparer)
Console.WriteLine("After sorting the entire Array using the reverse case-insensitive comparer:")
PrintKeysAndValues(myKeys, myValues)
End Sub
Public Shared Sub PrintKeysAndValues(myKeys() As [String], myValues() As [String])
Dim i As Integer
For i = 0 To myKeys.Length - 1
Console.WriteLine(" {0,-10}: {1}", myKeys(i), myValues(i))
Next i
Console.WriteLine()
End Sub
End Class
'This code produces the following output.
'
'The Array initially contains the following values:
' red : strawberries
' GREEN : PEARS
' YELLOW : LIMES
' BLUE : BERRIES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting a section of the Array using the default comparer:
' red : strawberries
' BLUE : BERRIES
' GREEN : PEARS
' YELLOW : LIMES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting a section of the Array using the reverse case-insensitive comparer:
' red : strawberries
' YELLOW : LIMES
' GREEN : PEARS
' BLUE : BERRIES
' purple : grapes
' black : olives
' orange : cantaloupe
'
'After sorting the entire Array using the default comparer:
' black : olives
' BLUE : BERRIES
' GREEN : PEARS
' orange : cantaloupe
' purple : grapes
' red : strawberries
' YELLOW : LIMES
'
'After sorting the entire Array using the reverse case-insensitive comparer:
' YELLOW : LIMES
' red : strawberries
' purple : grapes
' orange : cantaloupe
' GREEN : PEARS
' BLUE : BERRIES
' black : olives
Opmerkingen
Elke sleutel in de keyssleutel heeft een bijbehorend item in de Arrayitems.Array Wanneer een sleutel tijdens de sortering wordt verplaatst, wordt het bijbehorende item in het itemsArray item op dezelfde manier verplaatst. Daarom wordt het itemsgesorteerd op basis van de rangschikking van de bijbehorende sleutels in de Arraykeys.Array
Elke sleutel in de keysArray sleutel moet de IComparable interface implementeren om vergelijkingen met elke andere sleutel mogelijk te maken.
U kunt sorteren als er meer items zijn dan sleutels, maar de items met geen bijbehorende sleutels worden niet gesorteerd. U kunt niet sorteren als er meer sleutels zijn dan items; Als je dit doet, gooit een ArgumentException.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van keys.
Zie ook
- IComparable
- BinarySearch
- IDictionary
- Culture-Insensitive tekenreeksbewerkingen uitvoeren in matrices
Van toepassing op
Sort(Array)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Sorteert de elementen in een hele eendimensionale met Array behulp van de IComparable implementatie van elk element van het Array.
public:
static void Sort(Array ^ array);
public static void Sort(Array array);
static member Sort : Array -> unit
Public Shared Sub Sort (array As Array)
Parameters
Uitzonderingen
array is null.
array is multidimensionaal.
Een of meer elementen in de arrayIComparable interface implementeren niet.
Voorbeelden
In het volgende codevoorbeeld ziet u hoe u de waarden in een Array sorteerfunctie sorteert met behulp van de standaard-vergelijking en een aangepaste vergelijking waarmee de sorteervolgorde wordt omgekeerd. Houd er rekening mee dat het resultaat kan variëren, afhankelijk van de huidige CultureInfo.
using System;
using System.Collections;
public class ReverseComparer : IComparer
{
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
public int Compare(Object x, Object y)
{
return (new CaseInsensitiveComparer()).Compare(y, x );
}
}
public class Example
{
public static void Main()
{
// Create and initialize a new array.
String[] words = { "The", "QUICK", "BROWN", "FOX", "jumps",
"over", "the", "lazy", "dog" };
// Instantiate the reverse comparer.
IComparer revComparer = new ReverseComparer();
// Display the values of the array.
Console.WriteLine( "The original order of elements in the array:" );
DisplayValues(words);
// Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3);
Console.WriteLine( "After sorting elements 1-3 by using the default comparer:");
DisplayValues(words);
// Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer);
Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:");
DisplayValues(words);
// Sort the entire array using the default comparer.
Array.Sort(words);
Console.WriteLine( "After sorting the entire array by using the default comparer:");
DisplayValues(words);
// Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer);
Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:");
DisplayValues(words);
}
public static void DisplayValues(String[] arr)
{
for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
i++ ) {
Console.WriteLine( " [{0}] : {1}", i, arr[i] );
}
Console.WriteLine();
}
}
// The example displays the following output:
// The original order of elements in the array:
// [0] : The
// [1] : QUICK
// [2] : BROWN
// [3] : FOX
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the default comparer:
// [0] : The
// [1] : BROWN
// [2] : FOX
// [3] : QUICK
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the reverse case-insensitive comparer:
// [0] : The
// [1] : QUICK
// [2] : FOX
// [3] : BROWN
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting the entire array by using the default comparer:
// [0] : BROWN
// [1] : dog
// [2] : FOX
// [3] : jumps
// [4] : lazy
// [5] : over
// [6] : QUICK
// [7] : the
// [8] : The
//
// After sorting the entire array using the reverse case-insensitive comparer:
// [0] : the
// [1] : The
// [2] : QUICK
// [3] : over
// [4] : lazy
// [5] : jumps
// [6] : FOX
// [7] : dog
// [8] : BROWN
open System
open System.Collections
type ReverseComparer() =
interface IComparer with
member _.Compare(x, y) =
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
CaseInsensitiveComparer().Compare(y, x)
let displayValues (arr: string []) =
for i = 0 to arr.Length - 1 do
printfn $" [{i}] : {arr[i]}"
printfn ""
// Create and initialize a new array.
let words =
[| "The"; "QUICK"; "BROWN"; "FOX"; "jumps"
"over"; "the"; "lazy"; "dog" |]
// Instantiate the reverse comparer.
let revComparer = ReverseComparer()
// Display the values of the array.
printfn "The original order of elements in the array:"
displayValues words
// Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3)
printfn "After sorting elements 1-3 by using the default comparer:"
displayValues words
// Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer)
printfn "After sorting elements 1-3 by using the reverse case-insensitive comparer:"
displayValues words
// Sort the entire array using the default comparer.
Array.Sort words
printfn "After sorting the entire array by using the default comparer:"
displayValues words
// Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer)
printfn "After sorting the entire array using the reverse case-insensitive comparer:"
displayValues words
// The example displays the following output:
// The original order of elements in the array:
// [0] : The
// [1] : QUICK
// [2] : BROWN
// [3] : FOX
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the default comparer:
// [0] : The
// [1] : BROWN
// [2] : FOX
// [3] : QUICK
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the reverse case-insensitive comparer:
// [0] : The
// [1] : QUICK
// [2] : FOX
// [3] : BROWN
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting the entire array by using the default comparer:
// [0] : BROWN
// [1] : dog
// [2] : FOX
// [3] : jumps
// [4] : lazy
// [5] : over
// [6] : QUICK
// [7] : the
// [8] : The
//
// After sorting the entire array using the reverse case-insensitive comparer:
// [0] : the
// [1] : The
// [2] : QUICK
// [3] : over
// [4] : lazy
// [5] : jumps
// [6] : FOX
// [7] : dog
// [8] : BROWN
Imports System.Collections
Public Class ReverseComparer : Implements IComparer
' Call CaseInsensitiveComparer.Compare with the parameters reversed.
Function Compare(x As Object, y As Object) As Integer _
Implements IComparer.Compare
Return New CaseInsensitiveComparer().Compare(y, x)
End Function
End Class
Public Module Example
Public Sub Main()
' Create and initialize a new array.
Dim words() As String = { "The", "QUICK", "BROWN", "FOX", "jumps",
"over", "the", "lazy", "dog" }
' Instantiate a new custom comparer.
Dim revComparer As New ReverseComparer()
' Display the values of the array.
Console.WriteLine( "The original order of elements in the array:" )
DisplayValues(words)
' Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3)
Console.WriteLine( "After sorting elements 1-3 by using the default comparer:")
DisplayValues(words)
' Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer)
Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:")
DisplayValues(words)
' Sort the entire array using the default comparer.
Array.Sort(words)
Console.WriteLine( "After sorting the entire array by using the default comparer:")
DisplayValues(words)
' Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer)
Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:")
DisplayValues(words)
End Sub
Public Sub DisplayValues(arr() As String)
For i As Integer = arr.GetLowerBound(0) To arr.GetUpperBound(0)
Console.WriteLine(" [{0}] : {1}", i, arr(i))
Next
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
' The original order of elements in the array:
' [0] : The
' [1] : QUICK
' [2] : BROWN
' [3] : FOX
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting elements 1-3 by using the default comparer:
' [0] : The
' [1] : BROWN
' [2] : FOX
' [3] : QUICK
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting elements 1-3 by using the reverse case-insensitive comparer:
' [0] : The
' [1] : QUICK
' [2] : FOX
' [3] : BROWN
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting the entire array by using the default comparer:
' [0] : BROWN
' [1] : dog
' [2] : FOX
' [3] : jumps
' [4] : lazy
' [5] : over
' [6] : QUICK
' [7] : the
' [8] : The
'
' After sorting the entire array using the reverse case-insensitive comparer:
' [0] : the
' [1] : The
' [2] : QUICK
' [3] : over
' [4] : lazy
' [5] : jumps
' [6] : FOX
' [7] : dog
' [8] : BROWN
Opmerkingen
Elk element van array moet de IComparable interface implementeren om vergelijkingen met elk ander element in arrayte kunnen voeren.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van array.
Zie ook
Van toepassing op
Sort(Array, IComparer)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
public:
static void Sort(Array ^ array, System::Collections::IComparer ^ comparer);
public static void Sort(Array array, System.Collections.IComparer comparer);
public static void Sort(Array array, System.Collections.IComparer? comparer);
static member Sort : Array * System.Collections.IComparer -> unit
Public Shared Sub Sort (array As Array, comparer As IComparer)
Parameters
- array
- Array
De eendimensionale matrix die moet worden gesorteerd.
- comparer
- IComparer
De implementatie die moet worden gebruikt bij het vergelijken van elementen.
– of –
null om de IComparable implementatie van elk element te gebruiken.
Uitzonderingen
array is null.
array is multidimensionaal.
comparer is null, en een of meer elementen in array de IComparable interface niet implementeren.
De implementatie van de oorzaak van comparer een fout tijdens het sorteren. Bijvoorbeeld: comparer retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
Voorbeelden
In het volgende voorbeeld worden de waarden in een tekenreeksmatrix gesorteerd met behulp van de standaard comparer. Het definieert ook een aangepaste IComparer implementatie met de naam ReverseComparer die de standaardsorteerdvolgorde van een object omdraait tijdens het uitvoeren van een niet-hoofdlettergevoelige tekenreeksvergelijking. Houd er rekening mee dat de uitvoer afhankelijk kan zijn van de huidige cultuur.
using System;
using System.Collections;
public class ReverseComparer : IComparer
{
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
public int Compare(Object x, Object y)
{
return (new CaseInsensitiveComparer()).Compare(y, x );
}
}
public class Example
{
public static void Main()
{
// Create and initialize a new array.
String[] words = { "The", "QUICK", "BROWN", "FOX", "jumps",
"over", "the", "lazy", "dog" };
// Instantiate the reverse comparer.
IComparer revComparer = new ReverseComparer();
// Display the values of the array.
Console.WriteLine( "The original order of elements in the array:" );
DisplayValues(words);
// Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3);
Console.WriteLine( "After sorting elements 1-3 by using the default comparer:");
DisplayValues(words);
// Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer);
Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:");
DisplayValues(words);
// Sort the entire array using the default comparer.
Array.Sort(words);
Console.WriteLine( "After sorting the entire array by using the default comparer:");
DisplayValues(words);
// Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer);
Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:");
DisplayValues(words);
}
public static void DisplayValues(String[] arr)
{
for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
i++ ) {
Console.WriteLine( " [{0}] : {1}", i, arr[i] );
}
Console.WriteLine();
}
}
// The example displays the following output:
// The original order of elements in the array:
// [0] : The
// [1] : QUICK
// [2] : BROWN
// [3] : FOX
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the default comparer:
// [0] : The
// [1] : BROWN
// [2] : FOX
// [3] : QUICK
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the reverse case-insensitive comparer:
// [0] : The
// [1] : QUICK
// [2] : FOX
// [3] : BROWN
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting the entire array by using the default comparer:
// [0] : BROWN
// [1] : dog
// [2] : FOX
// [3] : jumps
// [4] : lazy
// [5] : over
// [6] : QUICK
// [7] : the
// [8] : The
//
// After sorting the entire array using the reverse case-insensitive comparer:
// [0] : the
// [1] : The
// [2] : QUICK
// [3] : over
// [4] : lazy
// [5] : jumps
// [6] : FOX
// [7] : dog
// [8] : BROWN
open System
open System.Collections
type ReverseComparer() =
interface IComparer with
member _.Compare(x, y) =
// Call CaseInsensitiveComparer.Compare with the parameters reversed.
CaseInsensitiveComparer().Compare(y, x)
let displayValues (arr: string []) =
for i = 0 to arr.Length - 1 do
printfn $" [{i}] : {arr[i]}"
printfn ""
// Create and initialize a new array.
let words =
[| "The"; "QUICK"; "BROWN"; "FOX"; "jumps"
"over"; "the"; "lazy"; "dog" |]
// Instantiate the reverse comparer.
let revComparer = ReverseComparer()
// Display the values of the array.
printfn "The original order of elements in the array:"
displayValues words
// Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3)
printfn "After sorting elements 1-3 by using the default comparer:"
displayValues words
// Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer)
printfn "After sorting elements 1-3 by using the reverse case-insensitive comparer:"
displayValues words
// Sort the entire array using the default comparer.
Array.Sort words
printfn "After sorting the entire array by using the default comparer:"
displayValues words
// Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer)
printfn "After sorting the entire array using the reverse case-insensitive comparer:"
displayValues words
// The example displays the following output:
// The original order of elements in the array:
// [0] : The
// [1] : QUICK
// [2] : BROWN
// [3] : FOX
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the default comparer:
// [0] : The
// [1] : BROWN
// [2] : FOX
// [3] : QUICK
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting elements 1-3 by using the reverse case-insensitive comparer:
// [0] : The
// [1] : QUICK
// [2] : FOX
// [3] : BROWN
// [4] : jumps
// [5] : over
// [6] : the
// [7] : lazy
// [8] : dog
//
// After sorting the entire array by using the default comparer:
// [0] : BROWN
// [1] : dog
// [2] : FOX
// [3] : jumps
// [4] : lazy
// [5] : over
// [6] : QUICK
// [7] : the
// [8] : The
//
// After sorting the entire array using the reverse case-insensitive comparer:
// [0] : the
// [1] : The
// [2] : QUICK
// [3] : over
// [4] : lazy
// [5] : jumps
// [6] : FOX
// [7] : dog
// [8] : BROWN
Imports System.Collections
Public Class ReverseComparer : Implements IComparer
' Call CaseInsensitiveComparer.Compare with the parameters reversed.
Function Compare(x As Object, y As Object) As Integer _
Implements IComparer.Compare
Return New CaseInsensitiveComparer().Compare(y, x)
End Function
End Class
Public Module Example
Public Sub Main()
' Create and initialize a new array.
Dim words() As String = { "The", "QUICK", "BROWN", "FOX", "jumps",
"over", "the", "lazy", "dog" }
' Instantiate a new custom comparer.
Dim revComparer As New ReverseComparer()
' Display the values of the array.
Console.WriteLine( "The original order of elements in the array:" )
DisplayValues(words)
' Sort a section of the array using the default comparer.
Array.Sort(words, 1, 3)
Console.WriteLine( "After sorting elements 1-3 by using the default comparer:")
DisplayValues(words)
' Sort a section of the array using the reverse case-insensitive comparer.
Array.Sort(words, 1, 3, revComparer)
Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:")
DisplayValues(words)
' Sort the entire array using the default comparer.
Array.Sort(words)
Console.WriteLine( "After sorting the entire array by using the default comparer:")
DisplayValues(words)
' Sort the entire array by using the reverse case-insensitive comparer.
Array.Sort(words, revComparer)
Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:")
DisplayValues(words)
End Sub
Public Sub DisplayValues(arr() As String)
For i As Integer = arr.GetLowerBound(0) To arr.GetUpperBound(0)
Console.WriteLine(" [{0}] : {1}", i, arr(i))
Next
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
' The original order of elements in the array:
' [0] : The
' [1] : QUICK
' [2] : BROWN
' [3] : FOX
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting elements 1-3 by using the default comparer:
' [0] : The
' [1] : BROWN
' [2] : FOX
' [3] : QUICK
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting elements 1-3 by using the reverse case-insensitive comparer:
' [0] : The
' [1] : QUICK
' [2] : FOX
' [3] : BROWN
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
' After sorting the entire array by using the default comparer:
' [0] : BROWN
' [1] : dog
' [2] : FOX
' [3] : jumps
' [4] : lazy
' [5] : over
' [6] : QUICK
' [7] : the
' [8] : The
'
' After sorting the entire array using the reverse case-insensitive comparer:
' [0] : the
' [1] : The
' [2] : QUICK
' [3] : over
' [4] : lazy
' [5] : jumps
' [6] : FOX
' [7] : dog
' [8] : BROWN
Opmerkingen
Als comparer dat het is null, moet elk element van array de interface de IComparable interface implementeren om vergelijkingen te kunnen maken met elk ander element in array.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van array.
.NET bevat vooraf gedefinieerde IComparer implementaties die worden vermeld in de volgende tabel.
| Implementation | Beschrijving |
|---|---|
| System.Collections.CaseInsensitiveComparer | Vergelijkt twee objecten, maar voert een niet-hoofdlettergevoelige vergelijking van tekenreeksen uit. |
| Comparer.Default | Vergelijkt twee objecten met behulp van de sorteerconventies van de huidige cultuur. |
| Comparer.DefaultInvariant | Vergelijkt twee objecten met behulp van de sorteerconventies van de invariante cultuur. |
| Comparer<T>.Default | Vergelijkt twee objecten van het type T met behulp van de standaardsorteervolgorde van het type. |
U kunt ook aangepaste vergelijkingen ondersteunen door een exemplaar van uw eigen IComparer implementatie op te geven voor de comparer parameter. In het voorbeeld wordt dit uitgevoerd door een ReverseComparer klasse te definiëren waarmee de standaardsortatievolgorde voor exemplaren van een type wordt omgekeerd en een tekenreeksvergelijking wordt uitgevoerd die niet hoofdlettergevoelig is.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Dit geldt voor het grootste deel voor matrices met minder dan of gelijk aan 16 elementen.
Zie ook
Van toepassing op
Sort<T>(T[])
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Sorteert de elementen in een geheel Array met behulp van de IComparable<T> algemene interface-implementatie van elk element van het Array.
public:
generic <typename T>
static void Sort(cli::array <T> ^ array);
public static void Sort<T>(T[] array);
static member Sort : 'T[] -> unit
Public Shared Sub Sort(Of T) (array As T())
Type parameters
- T
Het type van de elementen van de matrix.
Parameters
- array
- T[]
De eendimensionale, op nul gebaseerde Array sortering.
Uitzonderingen
array is null.
Een of meer elementen in de array algemene interface worden niet geïmplementeerd IComparable<T> .
Voorbeelden
In het volgende codevoorbeeld ziet u de algemene overbelasting van de Sort<T>(T[]) methode en de algemene overbelasting van de BinarySearch<T>(T[], T) methode. Er wordt een matrix met tekenreeksen gemaakt, in geen bepaalde volgorde.
De matrix wordt weergegeven, gesorteerd en opnieuw weergegeven.
Note
De aanroepen naar de Sort en BinarySearch algemene methoden zien er niet anders uit dan aanroepen naar hun niet-gegenereerde tegenhangers, omdat Visual Basic, C# en C++ het type van de algemene typeparameter afleiden uit het type van het eerste argument. Als u de Ildasm.exe (IL Disassembler) gebruikt om de Microsoft tussentaal (MSIL) te onderzoeken, kunt u zien dat de algemene methoden worden aangeroepen.
De BinarySearch<T>(T[], T) algemene overbelasting van de methode wordt vervolgens gebruikt om te zoeken naar twee tekenreeksen, een tekenreeks die zich niet in de matrix bevindt en een tekenreeks. De matrix en de retourwaarde van de BinarySearch methode worden doorgegeven aan de ShowWhere algemene methode, die de indexwaarde weergeeft als de tekenreeks wordt gevonden, en anders vallen de elementen tussen de zoekreeks als deze zich in de matrix bevinden. De index is negatief als de tekenreeks niet n de matrix is, dus de methode ShowWhere gebruikt de bitwise complement (de ~-operator in C#, Xor -1 in Visual Basic) om de index van het eerste element in de lijst te verkrijgen dat groter is dan de zoekreeks.
using System;
using System.Collections.Generic;
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);
}
Console.WriteLine("\nSort");
Array.Sort(dinosaurs);
Console.WriteLine();
foreach( string dinosaur in dinosaurs )
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("\nBinarySearch for 'Coelophysis':");
int index = Array.BinarySearch(dinosaurs, "Coelophysis");
ShowWhere(dinosaurs, index);
Console.WriteLine("\nBinarySearch for 'Tyrannosaurus':");
index = Array.BinarySearch(dinosaurs, "Tyrannosaurus");
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
Amargasaurus
Deinonychus
Edmontosaurus
Mamenchisaurus
Pachycephalosaurus
Tyrannosaurus
BinarySearch for 'Coelophysis':
Not found. Sorts between: Amargasaurus and Deinonychus.
BinarySearch for 'Tyrannosaurus':
Found at index 5.
*/
open System
let showWhere (array: 'a []) index =
if index < 0 then
// If the index is negative, it represents the bitwise
// complement of the next larger element in the array.
let index = ~~~index
printf "Not found. Sorts between: "
if index = 0 then
printf "beginning of array and "
else
printf $"{array[index - 1]} and "
if index = array.Length then
printfn "end of array."
else
printfn $"{array[index]}."
else
printfn $"Found at index {index}."
let dinosaurs =
[| "Pachycephalosaurus"
"Amargasaurus"
"Tyrannosaurus"
"Mamenchisaurus"
"Deinonychus"
"Edmontosaurus" |]
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
printfn "\nSort"
Array.Sort dinosaurs
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
printfn "\nBinarySearch for 'Coelophysis':"
let index = Array.BinarySearch(dinosaurs, "Coelophysis")
showWhere dinosaurs index
printfn "\nBinarySearch for 'Tyrannosaurus':"
Array.BinarySearch(dinosaurs, "Tyrannosaurus")
|> showWhere dinosaurs
// This code example produces the following output:
//
// Pachycephalosaurus
// Amargasaurus
// Tyrannosaurus
// Mamenchisaurus
// Deinonychus
// Edmontosaurus
//
// Sort
//
// Amargasaurus
// Deinonychus
// Edmontosaurus
// Mamenchisaurus
// Pachycephalosaurus
// Tyrannosaurus
//
// BinarySearch for 'Coelophysis':
// Not found. Sorts between: Amargasaurus and Deinonychus.
//
// BinarySearch for 'Tyrannosaurus':
// Found at index 5.
Imports System.Collections.Generic
Public Class Example
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Pachycephalosaurus", _
"Amargasaurus", _
"Tyrannosaurus", _
"Mamenchisaurus", _
"Deinonychus", _
"Edmontosaurus" }
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
Console.WriteLine(vbLf & "Sort")
Array.Sort(dinosaurs)
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
Console.WriteLine(vbLf & _
"BinarySearch for 'Coelophysis':")
Dim index As Integer = _
Array.BinarySearch(dinosaurs, "Coelophysis")
ShowWhere(dinosaurs, index)
Console.WriteLine(vbLf & _
"BinarySearch for 'Tyrannosaurus':")
index = Array.BinarySearch(dinosaurs, "Tyrannosaurus")
ShowWhere(dinosaurs, index)
End Sub
Private Shared Sub ShowWhere(Of T) _
(ByVal array() As T, ByVal index As Integer)
If index < 0 Then
' If the index is negative, it represents the bitwise
' complement of the next larger element in the array.
'
index = index Xor -1
Console.Write("Not found. Sorts between: ")
If index = 0 Then
Console.Write("beginning of array and ")
Else
Console.Write("{0} and ", array(index - 1))
End If
If index = array.Length Then
Console.WriteLine("end of array.")
Else
Console.WriteLine("{0}.", array(index))
End If
Else
Console.WriteLine("Found at index {0}.", index)
End If
End Sub
End Class
' This code example produces the following output:
'
'Pachycephalosaurus
'Amargasaurus
'Tyrannosaurus
'Mamenchisaurus
'Deinonychus
'Edmontosaurus
'
'Sort
'
'Amargasaurus
'Deinonychus
'Edmontosaurus
'Mamenchisaurus
'Pachycephalosaurus
'Tyrannosaurus
'
'BinarySearch for 'Coelophysis':
'Not found. Sorts between: Amargasaurus and Deinonychus.
'
'BinarySearch for 'Tyrannosaurus':
'Found at index 5.
Opmerkingen
Elk element van array moet de IComparable<T> algemene interface implementeren om vergelijkingen met elk ander element in arrayte kunnen stellen.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van array.
Zie ook
Van toepassing op
Sort<T>(T[], IComparer<T>)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Hiermee sorteert u de elementen in een Array met behulp van de opgegeven IComparer<T> algemene interface.
public:
generic <typename T>
static void Sort(cli::array <T> ^ array, System::Collections::Generic::IComparer<T> ^ comparer);
public static void Sort<T>(T[] array, System.Collections.Generic.IComparer<T> comparer);
public static void Sort<T>(T[] array, System.Collections.Generic.IComparer<T>? comparer);
static member Sort : 'T[] * System.Collections.Generic.IComparer<'T> -> unit
Public Shared Sub Sort(Of T) (array As T(), comparer As IComparer(Of T))
Type parameters
- T
Het type van de elementen van de matrix.
Parameters
- array
- T[]
De eendimensionale nulbasis Array die moet worden gesorteerd.
- comparer
- IComparer<T>
De IComparer<T> algemene interface-implementatie die moet worden gebruikt bij het vergelijken van elementen of null voor het gebruik van de IComparable<T> algemene interface-implementatie van elk element.
Uitzonderingen
array is null.
comparer is null, en een of meer elementen in array de algemene interface niet implementeren IComparable<T> .
De implementatie van de oorzaak van comparer een fout tijdens het sorteren. Bijvoorbeeld: comparer retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
Voorbeelden
In het volgende codevoorbeeld ziet u de algemene overbelasting van de Sort<T>(T[], IComparer<T>) methode en de algemene overbelasting van de BinarySearch<T>(T[], T, IComparer<T>) methode.
In het codevoorbeeld wordt een alternatieve vergelijkingsfunctie gedefinieerd voor tekenreeksen met de naam ReverseCompare, waarmee de algemene interface IComparer<string> (IComparer(Of String) in Visual Basic)) wordt geïmplementeerd. De vergelijkingsfunctie roept de CompareTo(String) methode aan, waarbij de volgorde van de comparands wordt omgedraaid, zodat de tekenreeksen hoog-naar-laag sorteren in plaats van laag-naar-hoog.
De matrix wordt weergegeven, gesorteerd en opnieuw weergegeven. Matrices moeten worden gesorteerd om de BinarySearch methode te kunnen gebruiken.
Note
De aanroepen naar de Sort<T>(T[], IComparer<T>) en BinarySearch<T>(T[], T, IComparer<T>) algemene methoden zien er niet anders uit dan aanroepen naar hun niet-gegenereerde tegenhangers, omdat Visual Basic, C# en C++ het type van de algemene typeparameter afleiden uit het type van het eerste argument. Als u de Ildasm.exe (IL Disassembler) gebruikt om de Microsoft tussentaal (MSIL) te onderzoeken, kunt u zien dat de algemene methoden worden aangeroepen.
De BinarySearch<T>(T[], T, IComparer<T>) algemene overbelasting van de methode wordt vervolgens gebruikt om te zoeken naar twee tekenreeksen, een tekenreeks die zich niet in de matrix bevindt en een tekenreeks. De matrix en de retourwaarde van de BinarySearch<T>(T[], T, IComparer<T>) methode worden doorgegeven aan de ShowWhere algemene methode, die de indexwaarde weergeeft als de tekenreeks wordt gevonden, en anders vallen de elementen tussen de zoekreeks als deze zich in de matrix bevinden. De index is negatief als de tekenreeks niet n de matrix is, dus de methode ShowWhere gebruikt de bitwise complement (de ~-operator in C#, Xor -1 in Visual Basic) om de index van het eerste element in de lijst te verkrijgen dat groter is dan de zoekreeks.
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.
*/
open System
open System.Collections.Generic
type ReverseComparer() =
interface IComparer<string> with
member _.Compare(x, y) =
// Compare y and x in reverse order.
y.CompareTo x
let showWhere (array: 'a []) index =
if index < 0 then
// If the index is negative, it represents the bitwise
// complement of the next larger element in the array.
let index = ~~~index
printf "Not found. Sorts between: "
if index = 0 then
printf "beginning of array and "
else
printf $"{array[index - 1]} and "
if index = array.Length then
printfn "end of array."
else
printfn $"{array[index]}."
else
printfn $"Found at index {index}."
let dinosaurs =
[| "Pachycephalosaurus"
"Amargasaurus"
"Tyrannosaurus"
"Mamenchisaurus"
"Deinonychus"
"Edmontosaurus" |]
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
let rc = ReverseComparer()
printfn "\nSort"
Array.Sort(dinosaurs, rc)
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
printfn "\nBinarySearch for 'Coelophysis':"
Array.BinarySearch(dinosaurs, "Coelophysis", rc)
|> showWhere dinosaurs
printfn "\nBinarySearch for 'Tyrannosaurus':"
Array.BinarySearch(dinosaurs, "Tyrannosaurus", rc)
|> showWhere dinosaurs
// 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.
Imports System.Collections.Generic
Public Class ReverseComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, _
ByVal y As String) As Integer _
Implements IComparer(Of String).Compare
' Compare y and x in reverse order.
Return y.CompareTo(x)
End Function
End Class
Public Class Example
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Pachycephalosaurus", _
"Amargasaurus", _
"Tyrannosaurus", _
"Mamenchisaurus", _
"Deinonychus", _
"Edmontosaurus" }
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
Dim rc As New ReverseComparer()
Console.WriteLine(vbLf & "Sort")
Array.Sort(dinosaurs, rc)
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
Console.WriteLine(vbLf & _
"BinarySearch for 'Coelophysis':")
Dim index As Integer = _
Array.BinarySearch(dinosaurs, "Coelophysis", rc)
ShowWhere(dinosaurs, index)
Console.WriteLine(vbLf & _
"BinarySearch for 'Tyrannosaurus':")
index = Array.BinarySearch(dinosaurs, "Tyrannosaurus", rc)
ShowWhere(dinosaurs, index)
End Sub
Private Shared Sub ShowWhere(Of T) _
(ByVal array() As T, ByVal index As Integer)
If index < 0 Then
' If the index is negative, it represents the bitwise
' complement of the next larger element in the array.
'
index = index Xor -1
Console.Write("Not found. Sorts between: ")
If index = 0 Then
Console.Write("beginning of array and ")
Else
Console.Write("{0} and ", array(index - 1))
End If
If index = array.Length Then
Console.WriteLine("end of array.")
Else
Console.WriteLine("{0}.", array(index))
End If
Else
Console.WriteLine("Found at index {0}.", index)
End If
End Sub
End Class
' 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.
Opmerkingen
Als comparer dat het is null, moet elk element van array de IComparable<T> algemene interface worden geïmplementeerd om vergelijkingen met elk ander element in arrayte kunnen stellen.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van array.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Dit geldt voor het grootste deel voor matrices met minder dan of gelijk aan 16 elementen.
Zie ook
- IComparer<T>
- IComparable<T>
- BinarySearch
- Culture-Insensitive tekenreeksbewerkingen uitvoeren in matrices
Van toepassing op
Sort<T>(T[], Comparison<T>)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Hiermee sorteert u de elementen in een Array met behulp van de opgegeven Comparison<T>.
public:
generic <typename T>
static void Sort(cli::array <T> ^ array, Comparison<T> ^ comparison);
public static void Sort<T>(T[] array, Comparison<T> comparison);
static member Sort : 'T[] * Comparison<'T> -> unit
Public Shared Sub Sort(Of T) (array As T(), comparison As Comparison(Of T))
Type parameters
- T
Het type van de elementen van de matrix.
Parameters
- array
- T[]
De eendimensionale, op nul gebaseerde Array sortering.
- comparison
- Comparison<T>
De Comparison<T> te gebruiken bij het vergelijken van elementen.
Uitzonderingen
De implementatie van de oorzaak van comparison een fout tijdens het sorteren. Bijvoorbeeld: comparison retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
Voorbeelden
In het volgende codevoorbeeld ziet u de overbelasting van de Sort(Comparison<T>) methode.
In het codevoorbeeld wordt een alternatieve vergelijkingsmethode gedefinieerd voor tekenreeksen met de naam CompareDinosByLength. Deze methode werkt als volgt: Eerst worden de comparands getestnull en wordt een null-verwijzing beschouwd als minder dan een niet-null-verwijzing. Ten tweede worden de tekenreekslengten vergeleken en wordt de langere tekenreeks als groter beschouwd. Ten derde, als de lengten gelijk zijn, wordt gewone tekenreeksvergelijking gebruikt.
Er wordt een matrix met tekenreeksen gemaakt en gevuld met vier tekenreeksen, in geen bepaalde volgorde. De lijst bevat ook een lege tekenreeks en een null-verwijzing. De lijst wordt weergegeven, gesorteerd met behulp van een Comparison<T> algemene gemachtigde die de CompareDinosByLength methode vertegenwoordigt en opnieuw wordt weergegeven.
using System;
using System.Collections.Generic;
public class Example
{
private static int CompareDinosByLength(string x, string y)
{
if (x == null)
{
if (y == null)
{
// If x is null and y is null, they're
// equal.
return 0;
}
else
{
// If x is null and y is not null, y
// is greater.
return -1;
}
}
else
{
// If x is not null...
//
if (y == null)
// ...and y is null, x is greater.
{
return 1;
}
else
{
// ...and y is not null, compare the
// lengths of the two strings.
//
int retval = x.Length.CompareTo(y.Length);
if (retval != 0)
{
// If the strings are not of equal length,
// the longer string is greater.
//
return retval;
}
else
{
// If the strings are of equal length,
// sort them with ordinary string comparison.
//
return x.CompareTo(y);
}
}
}
}
public static void Main()
{
string[] dinosaurs = {
"Pachycephalosaurus",
"Amargasaurus",
"",
null,
"Mamenchisaurus",
"Deinonychus" };
Display(dinosaurs);
Console.WriteLine("\nSort with generic Comparison<string> delegate:");
Array.Sort(dinosaurs, CompareDinosByLength);
Display(dinosaurs);
}
private static void Display(string[] arr)
{
Console.WriteLine();
foreach( string s in arr )
{
if (s == null)
Console.WriteLine("(null)");
else
Console.WriteLine("\"{0}\"", s);
}
}
}
/* This code example produces the following output:
"Pachycephalosaurus"
"Amargasaurus"
""
(null)
"Mamenchisaurus"
"Deinonychus"
Sort with generic Comparison<string> delegate:
(null)
""
"Deinonychus"
"Amargasaurus"
"Mamenchisaurus"
"Pachycephalosaurus"
*/
open System
let compareDinosByLength (x: string) (y: string) =
match x with
// If x is null and y is null, they're equal.
| null when isNull y -> 0
// If x is null and y is not null, y is greater.
| null -> -1
// If x is not null and y is null, x is greater.
| _ when isNull y -> 1
// If x is not null and y is not null, compare the lengths of the two strings.
| _ ->
let retval = x.Length.CompareTo y.Length
if retval <> 0 then
// If the strings are not of equal length, the longer string is greater.
retval
else
// If the strings are of equal length, sort them with ordinary string comparison.
x.CompareTo y
let display arr =
printfn ""
for s in arr do
if isNull s then
printfn "(null)"
else
printfn $"\"{s}\""
let dinosaurs =
[| "Pachycephalosaurus"
"Amargasaurus"
""
null
"Mamenchisaurus"
"Deinonychus" |]
display dinosaurs
printfn "\nSort with generic Comparison<string> delegate:"
Array.Sort(dinosaurs, compareDinosByLength)
display dinosaurs
// This code example produces the following output:
//
// "Pachycephalosaurus"
// "Amargasaurus"
// ""
// (null)
// "Mamenchisaurus"
// "Deinonychus"
//
// Sort with generic Comparison<string> delegate:
//
// (null)
// ""
// "Deinonychus"
// "Amargasaurus"
// "Mamenchisaurus"
// "Pachycephalosaurus"
//
Imports System.Collections.Generic
Public Class Example
Private Shared Function CompareDinosByLength( _
ByVal x As String, ByVal y As String) As Integer
If x Is Nothing Then
If y Is Nothing Then
' If x is Nothing and y is Nothing, they're
' equal.
Return 0
Else
' If x is Nothing and y is not Nothing, y
' is greater.
Return -1
End If
Else
' If x is not Nothing...
'
If y Is Nothing Then
' ...and y is Nothing, x is greater.
Return 1
Else
' ...and y is not Nothing, compare the
' lengths of the two strings.
'
Dim retval As Integer = _
x.Length.CompareTo(y.Length)
If retval <> 0 Then
' If the strings are not of equal length,
' the longer string is greater.
'
Return retval
Else
' If the strings are of equal length,
' sort them with ordinary string comparison.
'
Return x.CompareTo(y)
End If
End If
End If
End Function
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Pachycephalosaurus", _
"Amargasaurus", _
"", _
Nothing, _
"Mamenchisaurus", _
"Deinonychus" }
Display(dinosaurs)
Console.WriteLine(vbLf & "Sort with generic Comparison(Of String) delegate:")
Array.Sort(dinosaurs, AddressOf CompareDinosByLength)
Display(dinosaurs)
End Sub
Private Shared Sub Display(ByVal arr() As String)
Console.WriteLine()
For Each s As String In arr
If s Is Nothing Then
Console.WriteLine("(Nothing)")
Else
Console.WriteLine("""{0}""", s)
End If
Next
End Sub
End Class
' This code example produces the following output:
'
'"Pachycephalosaurus"
'"Amargasaurus"
'""
'(Nothing)
'"Mamenchisaurus"
'"Deinonychus"
'
'Sort with generic Comparison(Of String) delegate:
'
'(Nothing)
'""
'"Deinonychus"
'"Amargasaurus"
'"Mamenchisaurus"
'"Pachycephalosaurus"
Opmerkingen
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt als volgt gebruik van introspective sorteringsalgoritmen (introsort):
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van array.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Voor het grootste deel geldt dit voor matrices met minder dan of gelijk aan 6 elementen.
Zie ook
Van toepassing op
Sort<T>(T[], Int32, Int32)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Sorteert de elementen in een reeks elementen in een Array met behulp van de IComparable<T> algemene interface-implementatie van elk element van het Array.
public:
generic <typename T>
static void Sort(cli::array <T> ^ array, int index, int length);
public static void Sort<T>(T[] array, int index, int length);
static member Sort : 'T[] * int * int -> unit
Public Shared Sub Sort(Of T) (array As T(), index As Integer, length As Integer)
Type parameters
- T
Het type van de elementen van de matrix.
Parameters
- array
- T[]
De eendimensionale, op nul gebaseerde Array sortering.
- index
- Int32
De beginindex van het bereik dat moet worden gesorteerd.
- length
- Int32
Het aantal elementen in het bereik dat moet worden gesorteerd.
Uitzonderingen
array is null.
index is kleiner dan de ondergrens van array.
– of –
length is kleiner dan nul.
index en length geef geen geldig bereik op in array.
Een of meer elementen in de array algemene interface worden niet geïmplementeerd IComparable<T> .
Voorbeelden
In het volgende codevoorbeeld ziet u de algemene overbelasting van de Sort<T>(T[], Int32, Int32) methode en de algemene overbelasting van de methode voor het Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) sorteren van een bereik in een matrix.
Het codevoorbeeld definieert een alternatieve vergelijking voor tekenreeksen met de naam ReverseCompare, waarmee de algemene interface IComparer<string> (IComparer(Of String) in Visual Basic) wordt geïmplementeerd. De vergelijkingsfunctie roept de CompareTo(String) methode aan, waarbij de volgorde van de comparands wordt omgedraaid, zodat de tekenreeksen hoog-naar-laag sorteren in plaats van laag-naar-hoog.
In het codevoorbeeld wordt een matrix van dinosaurussen gemaakt en weergegeven, bestaande uit drie herbivoren gevolgd door drie carnivoren (tyrannosauriden, om precies te zijn). De Sort<T>(T[], Int32, Int32) algemene overbelasting van de methode wordt gebruikt om de laatste drie elementen van de matrix te sorteren, die vervolgens wordt weergegeven. De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) algemene overbelasting van de methode wordt gebruikt ReverseCompare om de laatste drie elementen in omgekeerde volgorde te sorteren. De grondig verwarde dinosaurussen worden opnieuw weergegeven.
Note
De aanroepen naar de Sort<T>(T[], IComparer<T>) en BinarySearch<T>(T[], T, IComparer<T>) algemene methoden zien er niet anders uit dan aanroepen naar hun niet-gegenereerde tegenhangers, omdat Visual Basic, C# en C++ het type van de algemene typeparameter afleiden uit het type van het eerste argument. Als u de Ildasm.exe (IL Disassembler) gebruikt om de Microsoft tussentaal (MSIL) te onderzoeken, kunt u zien dat de algemene methoden worden aangeroepen.
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
*/
open System
open System.Collections.Generic
type ReverseComparer() =
interface IComparer<string> with
member _.Compare(x, y) =
y.CompareTo x
let dinosaurs =
[| "Pachycephalosaurus"
"Amargasaurus"
"Mamenchisaurus"
"Tarbosaurus"
"Tyrannosaurus"
"Albertasaurus" |]
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
printfn "\nSort(dinosaurs, 3, 3)"
Array.Sort(dinosaurs, 3, 3)
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
let rc = ReverseComparer()
printfn "\nSort(dinosaurs, 3, 3, rc)"
Array.Sort(dinosaurs, 3, 3, rc)
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
// 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
Imports System.Collections.Generic
Public Class ReverseComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, _
ByVal y As String) As Integer _
Implements IComparer(Of String).Compare
' Compare y and x in reverse order.
Return y.CompareTo(x)
End Function
End Class
Public Class Example
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Pachycephalosaurus", _
"Amargasaurus", _
"Mamenchisaurus", _
"Tarbosaurus", _
"Tyrannosaurus", _
"Albertasaurus" }
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
Console.WriteLine(vbLf & "Sort(dinosaurs, 3, 3)")
Array.Sort(dinosaurs, 3, 3)
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
Dim rc As New ReverseComparer()
Console.WriteLine(vbLf & "Sort(dinosaurs, 3, 3, rc)")
Array.Sort(dinosaurs, 3, 3, rc)
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
End Sub
End Class
' 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
Opmerkingen
Elk element binnen het opgegeven bereik van elementen in array moet de IComparable<T> algemene interface implementeren om vergelijkingen met elk ander element in arrayte kunnen voeren.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is length.
Zie ook
Van toepassing op
Sort<T>(T[], Int32, Int32, IComparer<T>)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Hiermee sorteert u de elementen in een reeks elementen in een Array met behulp van de opgegeven IComparer<T> algemene interface.
public:
generic <typename T>
static void Sort(cli::array <T> ^ array, int index, int length, System::Collections::Generic::IComparer<T> ^ comparer);
public static void Sort<T>(T[] array, int index, int length, System.Collections.Generic.IComparer<T> comparer);
public static void Sort<T>(T[] array, int index, int length, System.Collections.Generic.IComparer<T>? comparer);
static member Sort : 'T[] * int * int * System.Collections.Generic.IComparer<'T> -> unit
Public Shared Sub Sort(Of T) (array As T(), index As Integer, length As Integer, comparer As IComparer(Of T))
Type parameters
- T
Het type van de elementen van de matrix.
Parameters
- array
- T[]
De eendimensionale, op nul gebaseerde Array sortering.
- index
- Int32
De beginindex van het bereik dat moet worden gesorteerd.
- length
- Int32
Het aantal elementen in het bereik dat moet worden gesorteerd.
- comparer
- IComparer<T>
De IComparer<T> algemene interface-implementatie die moet worden gebruikt bij het vergelijken van elementen of null voor het gebruik van de IComparable<T> algemene interface-implementatie van elk element.
Uitzonderingen
array is null.
index is kleiner dan de ondergrens van array.
– of –
length is kleiner dan nul.
index en length geef geen geldig bereik op in array.
– of –
De implementatie van de oorzaak van comparer een fout tijdens het sorteren. Bijvoorbeeld: comparer retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
comparer is null, en een of meer elementen in array de algemene interface niet implementeren IComparable<T> .
Voorbeelden
In het volgende codevoorbeeld ziet u de algemene overbelasting van de Sort<T>(T[], Int32, Int32) methode en de algemene overbelasting van de methode voor het Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) sorteren van een bereik in een matrix.
Het codevoorbeeld definieert een alternatieve vergelijking voor tekenreeksen met de naam ReverseCompare, waarmee de algemene interface IComparer<string> (IComparer(Of String) in Visual Basic) wordt geïmplementeerd. De vergelijkingsfunctie roept de CompareTo(String) methode aan, waarbij de volgorde van de comparands wordt omgedraaid, zodat de tekenreeksen hoog-naar-laag sorteren in plaats van laag-naar-hoog.
In het codevoorbeeld wordt een matrix van dinosaurussen gemaakt en weergegeven, bestaande uit drie herbivoren gevolgd door drie carnivoren (tyrannosauriden, om precies te zijn). De Sort<T>(T[], Int32, Int32) algemene overbelasting van de methode wordt gebruikt om de laatste drie elementen van de matrix te sorteren, die vervolgens wordt weergegeven. De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) algemene overbelasting van de methode wordt gebruikt ReverseCompare om de laatste drie elementen in omgekeerde volgorde te sorteren. De grondig verwarde dinosaurussen worden opnieuw weergegeven.
Note
De aanroepen naar de Sort<T>(T[], IComparer<T>) en BinarySearch<T>(T[], T, IComparer<T>) algemene methoden zien er niet anders uit dan aanroepen naar hun niet-gegenereerde tegenhangers, omdat Visual Basic, C# en C++ het type van de algemene typeparameter afleiden uit het type van het eerste argument. Als u de Ildasm.exe (IL Disassembler) gebruikt om de Microsoft tussentaal (MSIL) te onderzoeken, kunt u zien dat de algemene methoden worden aangeroepen.
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
*/
open System
open System.Collections.Generic
type ReverseComparer() =
interface IComparer<string> with
member _.Compare(x, y) =
y.CompareTo x
let dinosaurs =
[| "Pachycephalosaurus"
"Amargasaurus"
"Mamenchisaurus"
"Tarbosaurus"
"Tyrannosaurus"
"Albertasaurus" |]
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
printfn "\nSort(dinosaurs, 3, 3)"
Array.Sort(dinosaurs, 3, 3)
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
let rc = ReverseComparer()
printfn "\nSort(dinosaurs, 3, 3, rc)"
Array.Sort(dinosaurs, 3, 3, rc)
printfn ""
for dino in dinosaurs do
printfn $"{dino}"
// 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
Imports System.Collections.Generic
Public Class ReverseComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, _
ByVal y As String) As Integer _
Implements IComparer(Of String).Compare
' Compare y and x in reverse order.
Return y.CompareTo(x)
End Function
End Class
Public Class Example
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Pachycephalosaurus", _
"Amargasaurus", _
"Mamenchisaurus", _
"Tarbosaurus", _
"Tyrannosaurus", _
"Albertasaurus" }
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
Console.WriteLine(vbLf & "Sort(dinosaurs, 3, 3)")
Array.Sort(dinosaurs, 3, 3)
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
Dim rc As New ReverseComparer()
Console.WriteLine(vbLf & "Sort(dinosaurs, 3, 3, rc)")
Array.Sort(dinosaurs, 3, 3, rc)
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next
End Sub
End Class
' 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
Opmerkingen
Als comparer dat het is null, moet elk element binnen het opgegeven bereik van elementen array de IComparable<T> algemene interface implementeren om vergelijkingen met elk ander element in arrayte kunnen voeren.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is length.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Dit geldt voor het grootste deel voor matrices met minder dan of gelijk aan 16 elementen.
Zie ook
- IComparer<T>
- IComparable<T>
- BinarySearch
- Culture-Insensitive tekenreeksbewerkingen uitvoeren in matrices
Van toepassing op
Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Hiermee sorteert u een reeks elementen in een paar objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van Array de opgegeven IComparer<T> algemene interface.
public:
generic <typename TKey, typename TValue>
static void Sort(cli::array <TKey> ^ keys, cli::array <TValue> ^ items, int index, int length, System::Collections::Generic::IComparer<TKey> ^ comparer);
public static void Sort<TKey,TValue>(TKey[] keys, TValue[] items, int index, int length, System.Collections.Generic.IComparer<TKey> comparer);
public static void Sort<TKey,TValue>(TKey[] keys, TValue[]? items, int index, int length, System.Collections.Generic.IComparer<TKey>? comparer);
static member Sort : 'Key[] * 'Value[] * int * int * System.Collections.Generic.IComparer<'Key> -> unit
Public Shared Sub Sort(Of TKey, TValue) (keys As TKey(), items As TValue(), index As Integer, length As Integer, comparer As IComparer(Of TKey))
Type parameters
- TKey
Het type van de elementen van de sleutelmatrix.
- TValue
Het type elementen van de itemsmatrix.
Parameters
- keys
- TKey[]
De eendimensionale, op nul gebaseerde Array sleutel die de sleutels bevat die moeten worden gesorteerd.
- items
- TValue[]
De eendimensionale, op nul gebaseerde Array items die overeenkomen met de sleutels in keysof null om alleen keyste sorteren.
- index
- Int32
De beginindex van het bereik dat moet worden gesorteerd.
- length
- Int32
Het aantal elementen in het bereik dat moet worden gesorteerd.
- comparer
- IComparer<TKey>
De IComparer<T> algemene interface-implementatie die moet worden gebruikt bij het vergelijken van elementen of null voor het gebruik van de IComparable<T> algemene interface-implementatie van elk element.
Uitzonderingen
keys is null.
index is kleiner dan de ondergrens van keys.
– of –
length is kleiner dan nul.
items is niet null, en de ondergrens keys komt niet overeen met de ondergrens van items.
– of –
items is niet null, en de lengte van keys is groter dan de lengte van items.
– of –
index en length geef geen geldig bereik op in de keysArray.
– of –
items is niet null, en indexlength geef geen geldig bereik op in de itemsArray.
– of –
De implementatie van de oorzaak van comparer een fout tijdens het sorteren. Bijvoorbeeld: comparer retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
comparer is null, en een of meer elementen in de keysArray algemene interface niet implementeren IComparable<T> .
Voorbeelden
In het volgende codevoorbeeld ziet u de overbelasting Sort<TKey,TValue>(TKey[], TValue[])Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>)van , Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)en Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) algemene methoden voor het sorteren van paren matrices die sleutels en waarden vertegenwoordigen.
Het codevoorbeeld definieert een alternatieve vergelijking voor tekenreeksen met de naam ReverseCompare, waarmee de algemene interface IComparer<string>(IComparer(Of String) in Visual Basic) wordt geïmplementeerd. De vergelijkingsfunctie roept de CompareTo(String) methode aan, waarbij de volgorde van de comparands wordt omgedraaid, zodat de tekenreeksen hoog-naar-laag sorteren in plaats van laag-naar-hoog.
In het codevoorbeeld wordt een matrix met namen van dinosaurussen (de sleutels) en een matrix met gehele getallen gemaakt en weergegeven die de maximale lengte van elke dinosaurus in meters (de waarden) vertegenwoordigen. De matrices worden vervolgens meerdere keren gesorteerd en weergegeven:
- De Sort<TKey,TValue>(TKey[], TValue[]) overbelasting wordt gebruikt om beide matrices te sorteren in volgorde van de namen van de dinosaurussen in de eerste matrix.
- De Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>) overbelasting en een instantie van
ReverseCompareworden gebruikt om de sorteervolgorde van de gekoppelde matrices om te keren. - De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32) overbelasting wordt gebruikt om de laatste drie elementen van beide matrices te sorteren.
- De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) overbelasting wordt gebruikt om de laatste drie elementen van beide matrices in omgekeerde volgorde te sorteren.
Note
De aanroepen naar de algemene methoden zien er niet anders uit dan aanroepen naar hun niet-generische tegenhangers, omdat Visual Basic, C# en C++ het type van de algemene typeparameter afleiden van het type van het type van de eerste twee argumenten. Als u de Ildasm.exe (IL Disassembler) gebruikt om de Microsoft tussentaal (MSIL) te onderzoeken, kunt u zien dat de algemene methoden worden aangeroepen.
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.
*/
open System
open System.Collections.Generic
type ReverseComparer() =
interface IComparer<string> with
member _.Compare(x, y) =
y.CompareTo x
let dinosaurs =
[| "Seismosaurus"
"Chasmosaurus"
"Coelophysis"
"Mamenchisaurus"
"Caudipteryx"
"Cetiosaurus" |]
let dinosaurSizes = [| 40; 5; 3; 22; 1; 18 |]
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes)"
Array.Sort(dinosaurs, dinosaurSizes)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
let rc = ReverseComparer()
printfn "\nSort(dinosaurs, dinosaurSizes, rc)"
Array.Sort(dinosaurs, dinosaurSizes, rc)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes, 3, 3)"
Array.Sort(dinosaurs, dinosaurSizes, 3, 3)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)"
Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
// 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.
Imports System.Collections.Generic
Public Class ReverseComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, _
ByVal y As String) As Integer _
Implements IComparer(Of String).Compare
' Compare y and x in reverse order.
Return y.CompareTo(x)
End Function
End Class
Public Class Example
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Seismosaurus", _
"Chasmosaurus", _
"Coelophysis", _
"Mamenchisaurus", _
"Caudipteryx", _
"Cetiosaurus" }
Dim dinosaurSizes() As Integer = { 40, 5, 3, 22, 1, 18 }
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes)")
Array.Sort(dinosaurs, dinosaurSizes)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Dim rc As New ReverseComparer()
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, rc)")
Array.Sort(dinosaurs, dinosaurSizes, rc)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, 3, 3)")
Array.Sort(dinosaurs, dinosaurSizes, 3, 3)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, 3, 3, rc)")
Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
End Sub
End Class
' 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.
Opmerkingen
Elke sleutel in de keyssleutel heeft een bijbehorend item in de Arrayitems.Array Wanneer een sleutel tijdens de sortering wordt verplaatst, wordt het bijbehorende item in het itemsArray item op dezelfde manier verplaatst. Daarom wordt het itemsgesorteerd op basis van de rangschikking van de bijbehorende sleutels in de Arraykeys.Array
Als comparer dat het isnull, moet keys elke sleutel binnen het opgegeven bereik van elementen in de ArrayIComparable<T> algemene interface implementeren om vergelijkingen met elke andere sleutel te kunnen maken.
U kunt sorteren als er meer items zijn dan sleutels, maar de items met geen bijbehorende sleutels worden niet gesorteerd. U kunt niet sorteren als er meer sleutels zijn dan items; Als je dit doet, gooit een ArgumentException.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is length.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Dit geldt voor het grootste deel voor matrices met minder dan of gelijk aan 16 elementen.
Zie ook
- IComparer<T>
- IComparable<T>
- BinarySearch
- Culture-Insensitive tekenreeksbewerkingen uitvoeren in matrices
Van toepassing op
Sort<TKey,TValue>(TKey[], TValue[])
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Hiermee sorteert u een paar objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van Array de IComparable<T> algemene interface-implementatie van elke sleutel.
public:
generic <typename TKey, typename TValue>
static void Sort(cli::array <TKey> ^ keys, cli::array <TValue> ^ items);
public static void Sort<TKey,TValue>(TKey[] keys, TValue[] items);
public static void Sort<TKey,TValue>(TKey[] keys, TValue[]? items);
static member Sort : 'Key[] * 'Value[] -> unit
Public Shared Sub Sort(Of TKey, TValue) (keys As TKey(), items As TValue())
Type parameters
- TKey
Het type van de elementen van de sleutelmatrix.
- TValue
Het type elementen van de itemsmatrix.
Parameters
- keys
- TKey[]
De eendimensionale, op nul gebaseerde Array sleutel die de sleutels bevat die moeten worden gesorteerd.
- items
- TValue[]
De eendimensionale, op nul gebaseerde Array items die overeenkomen met de sleutels in keysof null om alleen keyste sorteren.
Uitzonderingen
keys is null.
items is niet null, en de ondergrens keys komt niet overeen met de ondergrens van items.
– of –
items is niet null, en de lengte van keys is groter dan de lengte van items.
Een of meer elementen in de keysArray interface implementeren de IComparable<T> algemene interface niet.
Voorbeelden
In het volgende codevoorbeeld ziet u de overbelasting Sort<TKey,TValue>(TKey[], TValue[])Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>)van , Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)en Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) algemene methoden voor het sorteren van paren matrices die sleutels en waarden vertegenwoordigen.
Het codevoorbeeld definieert een alternatieve vergelijking voor tekenreeksen met de naam ReverseCompare, waarmee de algemene interface IComparer<string> (IComparer(Of String) in Visual Basic) wordt geïmplementeerd. De vergelijkingsfunctie roept de CompareTo(String) methode aan, waarbij de volgorde van de comparands wordt omgedraaid, zodat de tekenreeksen hoog-naar-laag sorteren in plaats van laag-naar-hoog.
In het codevoorbeeld wordt een matrix met namen van dinosaurussen (de sleutels) en een matrix met gehele getallen gemaakt en weergegeven die de maximale lengte van elke dinosaurus in meters (de waarden) vertegenwoordigen. De matrices worden vervolgens meerdere keren gesorteerd en weergegeven:
- De Sort<TKey,TValue>(TKey[], TValue[]) overbelasting wordt gebruikt om beide matrices te sorteren in volgorde van de namen van de dinosaurussen in de eerste matrix.
- De Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>) overbelasting en een instantie van
ReverseCompareworden gebruikt om de sorteervolgorde van de gekoppelde matrices om te keren. - De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32) overbelasting wordt gebruikt om de laatste drie elementen van beide matrices te sorteren.
- De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) overbelasting wordt gebruikt om de laatste drie elementen van beide matrices in omgekeerde volgorde te sorteren.
Note
De aanroepen naar de algemene methoden zien er niet anders uit dan aanroepen naar hun niet-generische tegenhangers, omdat Visual Basic, C# en C++ het type van de algemene typeparameter afleiden van het type van het type van de eerste twee argumenten. Als u de Ildasm.exe (IL Disassembler) gebruikt om de Microsoft tussentaal (MSIL) te onderzoeken, kunt u zien dat de algemene methoden worden aangeroepen.
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.
*/
open System
open System.Collections.Generic
type ReverseComparer() =
interface IComparer<string> with
member _.Compare(x, y) =
y.CompareTo x
let dinosaurs =
[| "Seismosaurus"
"Chasmosaurus"
"Coelophysis"
"Mamenchisaurus"
"Caudipteryx"
"Cetiosaurus" |]
let dinosaurSizes = [| 40; 5; 3; 22; 1; 18 |]
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes)"
Array.Sort(dinosaurs, dinosaurSizes)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
let rc = ReverseComparer()
printfn "\nSort(dinosaurs, dinosaurSizes, rc)"
Array.Sort(dinosaurs, dinosaurSizes, rc)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes, 3, 3)"
Array.Sort(dinosaurs, dinosaurSizes, 3, 3)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)"
Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
// 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.
Imports System.Collections.Generic
Public Class ReverseComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, _
ByVal y As String) As Integer _
Implements IComparer(Of String).Compare
' Compare y and x in reverse order.
Return y.CompareTo(x)
End Function
End Class
Public Class Example
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Seismosaurus", _
"Chasmosaurus", _
"Coelophysis", _
"Mamenchisaurus", _
"Caudipteryx", _
"Cetiosaurus" }
Dim dinosaurSizes() As Integer = { 40, 5, 3, 22, 1, 18 }
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes)")
Array.Sort(dinosaurs, dinosaurSizes)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Dim rc As New ReverseComparer()
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, rc)")
Array.Sort(dinosaurs, dinosaurSizes, rc)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, 3, 3)")
Array.Sort(dinosaurs, dinosaurSizes, 3, 3)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, 3, 3, rc)")
Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
End Sub
End Class
' 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.
Opmerkingen
Elke sleutel in de keyssleutel heeft een bijbehorend item in de Arrayitems.Array Wanneer een sleutel tijdens de sortering wordt verplaatst, wordt het bijbehorende item in het itemsArray item op dezelfde manier verplaatst. Daarom wordt het itemsgesorteerd op basis van de rangschikking van de bijbehorende sleutels in de Arraykeys.Array
Elke sleutel in de keysArray sleutel moet de IComparable<T> algemene interface implementeren om vergelijkingen met elke andere sleutel mogelijk te maken.
U kunt sorteren als er meer items zijn dan sleutels, maar de items met geen bijbehorende sleutels worden niet gesorteerd. U kunt niet sorteren als er meer sleutels zijn dan items; Als je dit doet, gooit een ArgumentException.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van array.
Zie ook
- IComparable<T>
- BinarySearch
- IDictionary<TKey,TValue>
- Culture-Insensitive tekenreeksbewerkingen uitvoeren in matrices
Van toepassing op
Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Hiermee sorteert u een paar objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van Array de opgegeven IComparer<T> algemene interface.
public:
generic <typename TKey, typename TValue>
static void Sort(cli::array <TKey> ^ keys, cli::array <TValue> ^ items, System::Collections::Generic::IComparer<TKey> ^ comparer);
public static void Sort<TKey,TValue>(TKey[] keys, TValue[] items, System.Collections.Generic.IComparer<TKey> comparer);
public static void Sort<TKey,TValue>(TKey[] keys, TValue[]? items, System.Collections.Generic.IComparer<TKey>? comparer);
static member Sort : 'Key[] * 'Value[] * System.Collections.Generic.IComparer<'Key> -> unit
Public Shared Sub Sort(Of TKey, TValue) (keys As TKey(), items As TValue(), comparer As IComparer(Of TKey))
Type parameters
- TKey
Het type van de elementen van de sleutelmatrix.
- TValue
Het type elementen van de itemsmatrix.
Parameters
- keys
- TKey[]
De eendimensionale, op nul gebaseerde Array sleutel die de sleutels bevat die moeten worden gesorteerd.
- items
- TValue[]
De eendimensionale, op nul gebaseerde Array items die overeenkomen met de sleutels in keysof null om alleen keyste sorteren.
- comparer
- IComparer<TKey>
De IComparer<T> algemene interface-implementatie die moet worden gebruikt bij het vergelijken van elementen of null voor het gebruik van de IComparable<T> algemene interface-implementatie van elk element.
Uitzonderingen
keys is null.
items is niet null, en de ondergrens keys komt niet overeen met de ondergrens van items.
– of –
items is niet null, en de lengte van keys is groter dan de lengte van items.
– of –
De implementatie van de oorzaak van comparer een fout tijdens het sorteren. Bijvoorbeeld: comparer retourneert mogelijk niet 0 bij het vergelijken van een item met zichzelf.
comparer is null, en een of meer elementen in de keysArray algemene interface niet implementeren IComparable<T> .
Voorbeelden
In het volgende codevoorbeeld ziet u de overbelasting van de Sort<TKey,TValue>(TKey[], TValue[])methode [], Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>)Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)en Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) algemene methoden voor het sorteren van paren matrices die sleutels en waarden vertegenwoordigen.
Het codevoorbeeld definieert een alternatieve vergelijking voor tekenreeksen met de naam ReverseCompare, waarmee de algemene interface IComparer<string> (IComparer(Of String) in Visual Basic) wordt geïmplementeerd. De vergelijkingsfunctie roept de CompareTo(String) methode aan, waarbij de volgorde van de comparands wordt omgedraaid, zodat de tekenreeksen hoog-naar-laag sorteren in plaats van laag-naar-hoog.
In het codevoorbeeld wordt een matrix met namen van dinosaurussen (de sleutels) en een matrix met gehele getallen gemaakt en weergegeven die de maximale lengte van elke dinosaurus in meters (de waarden) vertegenwoordigen. De matrices worden vervolgens meerdere keren gesorteerd en weergegeven:
- De Sort<TKey,TValue>(TKey[], TValue[]) overbelasting wordt gebruikt om beide matrices te sorteren in volgorde van de namen van de dinosaurussen in de eerste matrix.
- De Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>) overbelasting en een instantie van
ReverseCompareworden gebruikt om de sorteervolgorde van de gekoppelde matrices om te keren. - De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32) overbelasting wordt gebruikt om de laatste drie elementen van beide matrices te sorteren.
- De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) overbelasting wordt gebruikt om de laatste drie elementen van beide matrices in omgekeerde volgorde te sorteren.
Note
De aanroepen naar de algemene methoden zien er niet anders uit dan aanroepen naar hun niet-generische tegenhangers, omdat Visual Basic, C# en C++ het type van de algemene typeparameter afleiden van het type van het type van de eerste twee argumenten. Als u de Ildasm.exe (IL Disassembler) gebruikt om de Microsoft tussentaal (MSIL) te onderzoeken, kunt u zien dat de algemene methoden worden aangeroepen.
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.
*/
open System
open System.Collections.Generic
type ReverseComparer() =
interface IComparer<string> with
member _.Compare(x, y) =
y.CompareTo x
let dinosaurs =
[| "Seismosaurus"
"Chasmosaurus"
"Coelophysis"
"Mamenchisaurus"
"Caudipteryx"
"Cetiosaurus" |]
let dinosaurSizes = [| 40; 5; 3; 22; 1; 18 |]
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes)"
Array.Sort(dinosaurs, dinosaurSizes)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
let rc = ReverseComparer()
printfn "\nSort(dinosaurs, dinosaurSizes, rc)"
Array.Sort(dinosaurs, dinosaurSizes, rc)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes, 3, 3)"
Array.Sort(dinosaurs, dinosaurSizes, 3, 3)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)"
Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
// 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.
Imports System.Collections.Generic
Public Class ReverseComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, _
ByVal y As String) As Integer _
Implements IComparer(Of String).Compare
' Compare y and x in reverse order.
Return y.CompareTo(x)
End Function
End Class
Public Class Example
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Seismosaurus", _
"Chasmosaurus", _
"Coelophysis", _
"Mamenchisaurus", _
"Caudipteryx", _
"Cetiosaurus" }
Dim dinosaurSizes() As Integer = { 40, 5, 3, 22, 1, 18 }
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes)")
Array.Sort(dinosaurs, dinosaurSizes)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Dim rc As New ReverseComparer()
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, rc)")
Array.Sort(dinosaurs, dinosaurSizes, rc)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, 3, 3)")
Array.Sort(dinosaurs, dinosaurSizes, 3, 3)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, 3, 3, rc)")
Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
End Sub
End Class
' 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.
Opmerkingen
Elke sleutel in de keyssleutel heeft een bijbehorend item in de Arrayitems.Array Wanneer een sleutel tijdens de sortering wordt verplaatst, wordt het bijbehorende item in het itemsArray item op dezelfde manier verplaatst. Daarom wordt het itemsgesorteerd op basis van de rangschikking van de bijbehorende sleutels in de Arraykeys.Array
Als comparer dat het zo is null, moet elke sleutel in de keysArray algemene interface de IComparable<T> algemene interface implementeren om vergelijkingen met elke andere sleutel te kunnen maken.
U kunt sorteren als er meer items zijn dan sleutels, maar de items met geen bijbehorende sleutels worden niet gesorteerd. U kunt niet sorteren als er meer sleutels zijn dan items; Als je dit doet, gooit een ArgumentException.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is de Length van array.
Notities voor bellers
.NET Framework 4 en eerdere versies hebben alleen het Quicksort-algoritme gebruikt. Quicksort identificeert ongeldige vergelijkingen in sommige situaties waarin de sorteerbewerking een IndexOutOfRangeException uitzondering genereert en een uitzondering genereert ArgumentException voor de aanroeper. Vanaf .NET Framework 4.5 is het mogelijk dat sorteerbewerkingen die eerder ArgumentException gooiden, geen uitzondering genereren, omdat de invoegingssorterings- en heapsort-algoritmen geen ongeldige vergelijking detecteren. Dit geldt voor het grootste deel voor matrices met minder dan of gelijk aan 16 elementen.
Zie ook
- IComparer<T>
- IComparable<T>
- BinarySearch
- Culture-Insensitive tekenreeksbewerkingen uitvoeren in matrices
Van toepassing op
Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
- Bron:
- Array.cs
Sorteert een reeks elementen in een paar objecten (een bevat de sleutels en de andere bevat de bijbehorende items) op basis van de sleutels in de eerste Array met behulp van Array de IComparable<T> algemene interface-implementatie van elke sleutel.
public:
generic <typename TKey, typename TValue>
static void Sort(cli::array <TKey> ^ keys, cli::array <TValue> ^ items, int index, int length);
public static void Sort<TKey,TValue>(TKey[] keys, TValue[] items, int index, int length);
public static void Sort<TKey,TValue>(TKey[] keys, TValue[]? items, int index, int length);
static member Sort : 'Key[] * 'Value[] * int * int -> unit
Public Shared Sub Sort(Of TKey, TValue) (keys As TKey(), items As TValue(), index As Integer, length As Integer)
Type parameters
- TKey
Het type van de elementen van de sleutelmatrix.
- TValue
Het type elementen van de itemsmatrix.
Parameters
- keys
- TKey[]
De eendimensionale, op nul gebaseerde Array sleutel die de sleutels bevat die moeten worden gesorteerd.
- items
- TValue[]
De eendimensionale, op nul gebaseerde Array items die overeenkomen met de sleutels in keysof null om alleen keyste sorteren.
- index
- Int32
De beginindex van het bereik dat moet worden gesorteerd.
- length
- Int32
Het aantal elementen in het bereik dat moet worden gesorteerd.
Uitzonderingen
keys is null.
index is kleiner dan de ondergrens van keys.
– of –
length is kleiner dan nul.
items is niet null, en de ondergrens keys komt niet overeen met de ondergrens van items.
– of –
items is niet null, en de lengte van keys is groter dan de lengte van items.
– of –
index en length geef geen geldig bereik op in de keysArray.
– of –
items is niet null, en indexlength geef geen geldig bereik op in de itemsArray.
Een of meer elementen in de keysArray interface implementeren de IComparable<T> algemene interface niet.
Voorbeelden
In het volgende codevoorbeeld ziet u de overbelasting Sort<TKey,TValue>(TKey[], TValue[])Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>)van , Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)en Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) algemene methoden voor het sorteren van paren matrices die sleutels en waarden vertegenwoordigen.
Het codevoorbeeld definieert een alternatieve vergelijking voor tekenreeksen met de naam ReverseCompare, waarmee de algemene interface IComparer<string> (IComparer(Of String) in Visual Basic) wordt geïmplementeerd. De vergelijkingsfunctie roept de CompareTo(String) methode aan, waarbij de volgorde van de comparands wordt omgedraaid, zodat de tekenreeksen hoog-naar-laag sorteren in plaats van laag-naar-hoog.
In het codevoorbeeld wordt een matrix met namen van dinosaurussen (de sleutels) en een matrix met gehele getallen gemaakt en weergegeven die de maximale lengte van elke dinosaurus in meters (de waarden) vertegenwoordigen. De matrices worden vervolgens meerdere keren gesorteerd en weergegeven:
- De Sort<TKey,TValue>(TKey[], TValue[]) overbelasting wordt gebruikt om beide matrices te sorteren in volgorde van de namen van de dinosaurussen in de eerste matrix.
- De Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>) overbelasting en een instantie van
ReverseCompareworden gebruikt om de sorteervolgorde van de gekoppelde matrices om te keren. - De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32) overbelasting wordt gebruikt om de laatste drie elementen van beide matrices te sorteren.
- De Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) overbelasting wordt gebruikt om de laatste drie elementen van beide matrices in omgekeerde volgorde te sorteren.
Note
De aanroepen naar de algemene methoden zien er niet anders uit dan aanroepen naar hun niet-generische tegenhangers, omdat Visual Basic, C# en C++ het type van de algemene typeparameter afleiden van het type van het type van de eerste twee argumenten. Als u de Ildasm.exe (IL Disassembler) gebruikt om de Microsoft tussentaal (MSIL) te onderzoeken, kunt u zien dat de algemene methoden worden aangeroepen.
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.
*/
open System
open System.Collections.Generic
type ReverseComparer() =
interface IComparer<string> with
member _.Compare(x, y) =
y.CompareTo x
let dinosaurs =
[| "Seismosaurus"
"Chasmosaurus"
"Coelophysis"
"Mamenchisaurus"
"Caudipteryx"
"Cetiosaurus" |]
let dinosaurSizes = [| 40; 5; 3; 22; 1; 18 |]
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes)"
Array.Sort(dinosaurs, dinosaurSizes)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
let rc = ReverseComparer()
printfn "\nSort(dinosaurs, dinosaurSizes, rc)"
Array.Sort(dinosaurs, dinosaurSizes, rc)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes, 3, 3)"
Array.Sort(dinosaurs, dinosaurSizes, 3, 3)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
printfn "\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)"
Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc)
printfn ""
for i = 0 to dinosaurs.Length - 1 do
printfn $"{dinosaurs[i]}: up to {dinosaurSizes[i]} meters long."
// 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.
Imports System.Collections.Generic
Public Class ReverseComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, _
ByVal y As String) As Integer _
Implements IComparer(Of String).Compare
' Compare y and x in reverse order.
Return y.CompareTo(x)
End Function
End Class
Public Class Example
Public Shared Sub Main()
Dim dinosaurs() As String = { _
"Seismosaurus", _
"Chasmosaurus", _
"Coelophysis", _
"Mamenchisaurus", _
"Caudipteryx", _
"Cetiosaurus" }
Dim dinosaurSizes() As Integer = { 40, 5, 3, 22, 1, 18 }
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes)")
Array.Sort(dinosaurs, dinosaurSizes)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Dim rc As New ReverseComparer()
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, rc)")
Array.Sort(dinosaurs, dinosaurSizes, rc)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, 3, 3)")
Array.Sort(dinosaurs, dinosaurSizes, 3, 3)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
Console.WriteLine(vbLf & _
"Sort(dinosaurs, dinosaurSizes, 3, 3, rc)")
Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc)
Console.WriteLine()
For i As Integer = 0 To dinosaurs.Length - 1
Console.WriteLine("{0}: up to {1} meters long.", _
dinosaurs(i), dinosaurSizes(i))
Next
End Sub
End Class
' 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.
Opmerkingen
Elke sleutel in de keyssleutel heeft een bijbehorend item in de Arrayitems.Array Wanneer een sleutel tijdens de sortering wordt verplaatst, wordt het bijbehorende item in het itemsArray item op dezelfde manier verplaatst. Daarom wordt het itemsgesorteerd op basis van de rangschikking van de bijbehorende sleutels in de Arraykeys.Array
Elke sleutel binnen het opgegeven bereik van elementen in de keysArray moet de IComparable<T> algemene interface implementeren om vergelijkingen met elke andere sleutel mogelijk te maken.
U kunt sorteren als er meer items zijn dan sleutels, maar de items met geen bijbehorende sleutels worden niet gesorteerd. U kunt niet sorteren als er meer sleutels zijn dan items; Als je dit doet, gooit een ArgumentException.
Als het sorteren niet is voltooid, zijn de resultaten niet gedefinieerd.
Deze methode maakt gebruik van het introspective sorteringsalgoritmen (introsort) als volgt:
Als de partitiegrootte kleiner is dan of gelijk is aan 16 elementen, wordt een sorteeralgoritmen voor invoeging gebruikt.
Als het aantal partities groter is dan 2 * LogN, waarbij N het bereik van de invoermatrix is, wordt een Heapsort-algoritme gebruikt.
Anders wordt een Quicksort-algoritme gebruikt.
Deze implementatie voert een instabiele sortering uit; als twee elementen gelijk zijn, blijft de volgorde mogelijk niet behouden. Een stabiele sortering behoudt daarentegen de volgorde van elementen die gelijk zijn.
Deze methode is een O(n logboek n) bewerking, waar n is length.