Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Array.Sort<TKey, TValue> (Método) (TKey[], TValue[], Int32, Int32, IComparer<TKey>)

Ordena un intervalo de elementos de un par de objetos Array (uno contiene las claves y el otro contiene los elementos correspondientes) en función de las claves de la primera matriz Array utilizando la interfaz genérica IComparer<T> especificada.

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)

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

Parámetros de tipo

TKey

Tipo de los elementos de la matriz de claves.

TValue

Tipo de los elementos de la matriz de elementos.

Parámetros

keys
Tipo: TKey[]
Matriz Array unidimensional de base cero que contiene las claves que se van a ordenar.
items
Tipo: TValue[]
Matriz Array unidimensional de base cero que contiene los elementos que se corresponden con las claves del parámetro keys; o null para ordenar solo keys.
index
Tipo: System.Int32
Índice inicial del intervalo que se va a ordenar.
length
Tipo: System.Int32
Número de elementos del intervalo que se va a ordenar.
comparer
Tipo: System.Collections.Generic.IComparer<TKey>
Implementación de la interfaz genérica IComparer<T> que se va a utilizar para comparar elementos o null si se va a utilizar la implementación de la interfaz genérica IComparable<T> de cada elemento.

ExcepciónCondición
ArgumentNullException

keys es null.

ArgumentOutOfRangeException

index es menor que el límite inferior de keys.

O bien

length es menor que cero.

ArgumentException

items no es null, y el límite inferior de keys no coincide con el límite inferior de items.

O bien

items no es null, y la longitud de keys es mayor que la longitud de items.

O bien

index y length no especifican un intervalo válido en la matriz Array de keys.

O bien

items no es null, e index y length no especifican un intervalo válido de la matriz Array de items.

O bien

La implementación de comparer ha producido un error durante la ordenación. Por ejemplo, es posible que comparer no devuelva 0 al comparar un elemento con sigo mismo.

InvalidOperationException

El valor de comparer es null, y uno o varios elementos de la matriz Array de keys no implementan la interfaz genérica IComparable<T>.

Cada una de las claves de la matriz Array de keys se corresponde con un elemento de la matriz Array de items. Si durante la ordenación se cambia la posición de una clave, también se cambia la posición del elemento correspondiente de la matriz Array de items. Por lo tanto, la matriz Array de items se ordena de acuerdo con la disposición de las claves correspondientes en la matriz Array de keys.

Si el valor de comparer es null, cada una de las claves del intervalo de elementos especificado de la matriz Array de keys debe implementar la interfaz genérica IComparable<T> para poder realizar comparaciones con el resto de las claves.

Puede ordenar si hay más elementos que claves, pero los elementos que no tienen clave correspondiente no se ordenarán. No puede ordenar si hay más claves que elementos; si lo hace, se produce ArgumentException.

Si la ordenación no se realiza correctamente, los resultados quedarán sin definir.

Este método utiliza el algoritmo introspectivo sort (introsort) como sigue:

  • Si el tamaño de la partición es menor que 16 elementos, utiliza ordenación de inserción un algoritmo.

  • Si el número de particiones supera 2 * registrarf, donde es el intervalo f de la matriz de entrada, utiliza Heapsort un algoritmo.

  • Si no, utiliza Quicksort un algoritmo.

Esta implementación realiza una ordenación inestable; es decir, si hay dos elementos iguales, es posible que no se mantenga su orden. En contraste, una ordenación estable conserva el orden de los elementos que son iguales.

Para las matrices que se ordenan mediante el Heapsort y algoritmos de Quicksort, en el peor de los casos, este método es una operación de O (n registrar n), donde lengthn .

Notas para los llamadores

.NET Framework 4 y versiones anteriores utilizaban solo el algoritmo de Quicksort. Quicksort identifica comparadores no válidos en algunas situaciones en las que la operación de ordenación produzca una excepción de IndexOutOfRangeException , y produce una excepción de ArgumentException al llamador. A partir de .NET Framework 4.5, es posible que ordenar las operaciones que produjo previamente ArgumentException no producirá una excepción, porque los algoritmos de ordenación y de heapsort de inserción no detectan un comparador no válido. En general, esto se aplica a las matrices con menos de 16 elementos.

En el ejemplo de código siguiente se muestran las sobrecargas de los métodos genéricos Sort<TKey, TValue>(TKey[], TValue[]), Sort<TKey, TValue>(TKey[], TValue[], IComparer<TKey>), Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32) y Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) para ordenar pares de matrices que representan claves y valores.

En el ejemplo de código se define un comparador alternativo para las cadenas, denominado ReverseCompare, que implementa la interfaz genérica IComparer<string> (IComparer(Of String) en Visual Basic, IComparer<String^> en Visual C++). El comparador llama al método CompareTo(String), invirtiendo el orden de los términos de la comparación para que las cadenas se ordenen de mayor a menor, y no de menor a mayor.

En el ejemplo de código se crea y muestra una matriz de nombres de dinosaurios (las claves) y una matriz de enteros que representa la longitud máxima de cada dinosaurio en metros (los valores). A continuación, se ordenan y muestran las matrices varias veces:

NotaNota

Las llamadas a los métodos genéricos no presentan ninguna diferencia respecto de las llamadas a sus homólogos no genéricos, puesto que Visual Basic, C# y C++ deducen el tipo del parámetro de tipo genérico a partir del tipo de los dos argumentos primeros. Si utiliza Ildasm.exe (Desensamblador de IL) para examinar el lenguaje intermedio de Microsoft (MSIL), puede ver que se llama a los métodos genéricos.


using System;
using System.Collections.Generic;

public class ReverseComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Compare y and x in reverse order.
        return y.CompareTo(x);
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {
            "Seismosaurus", 
            "Chasmosaurus", 
            "Coelophysis", 
            "Mamenchisaurus", 
            "Caudipteryx", 
            "Cetiosaurus"  };

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

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

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

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

        ReverseComparer rc = new ReverseComparer();

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

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

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

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

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

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

/* This code example produces the following output:

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

Sort(dinosaurs, dinosaurSizes)

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

Sort(dinosaurs, dinosaurSizes, rc)

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

Sort(dinosaurs, dinosaurSizes, 3, 3)

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

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

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


.NET Framework

Compatible con: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

.NET para aplicaciones de Windows Phone

Compatible con: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft