English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# SortedList (lista ordenada)

SortedList<TKey, TValue> y SortedList son clases de colección que pueden almacenar pares clave-valor ordenados por clave basados en la implementación de IComparer. Por ejemplo, si la clave es de tipo primario, se ordena en orden ascendente.

C# admite SortedList genérico y no genérico. Se recomienda usar SortedList < TKey, TValue > genérico, porque se ejecuta más rápido y es menos probable que se produzcan errores.

Características de SortedList

  • SortedList<TKey,TValue> es un array de pares clave-valor ordenados por clave.

  • Los elementos se ordenan inmediatamente después de agregarlos. Se ordenan los tipos de clave primarios en orden ascendente según IComparer < T >, y se ordenan las claves de objeto.

  • Pertenece al espacio de nombres System.Collection.Generic.

  • La clave debe ser única y no puede ser null.

  • El valor puede ser null o repetido.

  • Se puede acceder al valor pasando la clave relevante al índice mySortedList[key]

  • Contiene elementos de tipo KeyValuePair <TKey,TValue>

  • Usa menos memoria que SortedDictionary<TKey,TValue>.

  • La recuperación de datos después de la ordenación es más rápida, mientras que la inserción y eliminación de pares clave-valor en SortedDictionary<TKey,TValue> es más rápida.

Crear SortedList

El siguiente ejemplo muestra cómo crear una SortedList genérica<TKey, TValue> y agregar pares clave-valor.

//Lista de claves enteras, valores de cadena 
SortedList<int, string> numberNames = new SortedList<int, string>();
numberNames.Add(3, "Three");
numberNames.Add(1, "One");
numberNames.Add(2, "Two");
numberNames.Add(4, null);
numberNames.Add(10, "Diez");
numberNames.Add(5, "Five");
//Lo siguiente provocará una excepción
//numberNames.Add("Three", 3); //Error en tiempo de compilación: la clave debe ser de tipo int
//numberNames.Add(1, "One"); //Ejecución en tiempo de ejecución: clave repetida
//numberNames.Add(null, "Five");//Excepción en tiempo de ejecución: la clave no puede ser null

En el ejemplo anterior, un objeto SortedList<TKey, TValue> genérico se crea especificando el tipo de clave y valor que va a almacenar. SortedList<int, string> almacenará claves de tipo int y valores de tipo string.

El método Add() se utiliza para agregar un solo par clave-valor en SortedList. La clave no puede ser null o repetida. Si existe, lanzará una excepción en tiempo de ejecución. El valor puede repetirse, y si el tipo puede ser null, puede ser null.

Al instanciar la instancia de SortedList, usar colección-Sintaxis de inicializador para inicializar con múltiples pares clave-valor, como se muestra a continuación.

//Crear SortedList con claves de cadena y valores de cadena 
//Usar colección-sintaxis de inicializador
SortedList<string, string> cities = new SortedList<string, string>()
                                    {
                                        {"London", "UK"},
                                        {"New York", "USA"},
                                        {"Mumbai", "India"},
                                        {"Johannesburg", "South Africa"}
                                    });

Después de agregar un par clave-valor a SortedList, reordenar los pares clave-valor según el orden ascendente de las claves. El siguiente ejemplo muestra todos los claves y valores utilizando un ciclo foreach.

SortedList<int, string> numberNames = new SortedList<int, string>()
                                    {
                                        {3, "Three"},
                                        {5, "Five"},
                                        {1, "One"}
                                    });
Console.WriteLine("---Par clave-valor inicial--");
foreach(KeyValuePair<int, string> kvp in numberNames)
    Console.WriteLine("key: {0}, value: {1}}")1Console.WriteLine("key: {0}, value: {1}");
numberNames.Add(6, "Six");
numberNames.Add(2, "Two");
numberNames.Add(4, "Four");
Console.WriteLine("---Después de agregar un nuevo par clave-valor--");
foreach (var kvp in numberNames)
    Console.WriteLine("key: {0}, value: {1}}")1Console.WriteLine("key: {0}, value: {1}");
Salida:
---Par clave-valor inicial--
key: 1, value: One
key: 3, value: Three
key: 5, value: Five
---Después de agregar un nuevo par clave-valor--
key: 1, value: One
key: 2, value: Two
key: 3, value: Three
key: 4, value: Four
key: 5, value: Five
key: 6, valor: Six

Acceder a SortedList

En el índiceador SortedList[key], especificar una clave para obtener o establecer el valor en SortedList.

SortedList<int, string> numberNames = new SortedList<int, string>()
                                    {
                                        {3, "Three"},
                                        {1, "One"},
                                        {2, "Two"
                                    });
Console.WriteLine(numberNames[1]); //Salida: One
Console.WriteLine(numberNames[2]); //Salida: Two
Console.WriteLine(numberNames[3]); //Salida: Three
//Console.WriteLine(numberNames[10]); //Lanzamiento en tiempo de ejecución KeyNotFoundException
numberNames[2] = "TWO"; //Actualizar el valor
numberNames[4] = "Four"; //Si la clave no existe, agregar un nuevo par clave-valor

Arriba, numberNames[10] 将抛出一个KeyNotFoundException因为指定的键10在 sortedlist 中不存在的原因。为防止此异常,请使用ContainsKey()或TryGetValue()方法,如下所示。

SortedList<int, string> numberNames = new SortedList<int, string>()
                                    {
                                        {3, "Three"},
                                        {1, "One"},
                                        {2, "Two"
                                    });
if (numberNames.ContainsKey(4)) {
    numberNames[4] = "four";
}
int result;
if (numberNames.TryGetValue(4, out result))
    Console.WriteLine("Key: {0}, Value: {1} 4, result);
Salida:
Key:4, Value: Four

如果要使用for循环迭代SortedList,请使用Keys和Values属性。

SortedList<int, string> numberNames = new SortedList<int, string>()
                                    {
                                        {3, "Three"},
                                        {1, "One"},
                                        {2, "Two"
                                    });
for (int i = 0; i < numberNames.Count;++)
{
    Console.WriteLine("key: {0}, value: {1}}")1}, numberNames.Keys[i], numberNames.Values[i]);
}
Salida:
key: 1, value: One
key: 2, value: Two
key: 3, value: Three

从SortedList中删除元素

使用 Remove(key) 和 RemoveAt(index) 方法从 SortedList 中删除键值对。

SortedList<int, string> numberNames = new SortedList<int, string>()
                                    {
                                        {3, "Three"},
                                        {1, "One"},
                                        {2, "Two"},
                                        {5, "Five"},
                                        {4, "Four"
                                    });
    
numberNames.Remove(1);//移除键1对
numberNames.Remove(10);//移除键1对,如果不存在,则没有错误
numberNames.RemoveAt(0);//从索引0删除键值对 
//numberNames.RemoveAt(10);//运行时异常:ArgumentOutOfRangeException
foreach (var kvp in numberNames)
	Console.WriteLine("key: {0}, value: {1}}")1Console.WriteLine("key: {0}, value: {1}");
Salida:
key: 3, value: Three
key: 4, value: Four
key: 5, value: Five

Jerarquía de la clase SortedList

La siguiente imagen ilustra la jerarquía de SortedList.

Puede obtener más información sobre los métodos y propiedades de SortedList en docs.microsoft.com