Lista ordenada no genérica en C#

Lista ordenada no genérica en C#

Clase de colección SortedList no genérica en C# con ejemplos

En este artículo, voy a hablar sobre la clase de colección SortedList no genérica en C# con ejemplos. Lea nuestro artículo anterior donde discutimos la clase de colección de cola no genérica en C# con ejemplos. Al final de este artículo, comprenderá los siguientes consejos con ejemplos.

  1. ¿Qué es SortedList en C#?
  2. Métodos, propiedades y constructor de la clase de colección SortedList no genérica en C#
  3. ¿Cómo crear una lista ordenada en C#?
  4. ¿Cómo agregar elementos a una lista ordenada en C#?
  5. ¿Cómo acceder a una lista ordenada en C#?
  6. ¿Cómo quitar elementos de una lista ordenada en C#?
  7. ¿Cómo comprobar la disponibilidad de pares clave/valor en una lista ordenada en C#?
  8. ¿Cómo clonar la lista ordenada no genérica en C#?
  9. ¿Cuál es el uso del método CopyTo de la clase de colección SortedList no genérica en C#?
  10. ¿Cuándo usar la colección SortedList no genérica en C#?
¿Qué es SortedList en C#?

La clase de colección SortedList no genérica en C# representa una colección de pares clave/valor que se ordenan por claves y son accesibles por clave e índice. Por defecto, ordena los pares clave/valor en orden ascendente. La clase SortedList no genérica pertenece a System.Collections espacio de nombres.

Propiedades de la clase SortedList no genérica en C#:
  1. La clase SortedList no genérica en C# implementa las interfaces IEnumerable, ICollection, IDictionary e ICloneable.
  2. Podemos acceder al elemento por su clave o por su índice en SortedList.
  3. El objeto Non-Generic SortedList mantiene internamente dos matrices para almacenar los elementos de la lista, es decir, una matriz para las claves y otra matriz para los valores asociados. Aquí, la clave no puede ser nula, pero el valor puede ser nulo. Y una más, no permite llaves duplicadas.
  4. La capacidad del objeto Non-Generic SortedList es el número de pares clave/valor que contiene.
  5. En el objeto Non-Generic SortedList en C#, podemos almacenar valores del mismo tipo y de diferentes tipos, ya que opera en el tipo de datos del objeto.
  6. En la misma SortedList, no es posible almacenar claves de diferentes tipos de datos. Si lo intenta, el compilador lanzará una excepción.
Métodos, propiedades y constructor de la clase de colección SortedList no genérica en C#:

Si va a la definición de clase de colección de lista ordenada no genérica, verá lo siguiente. Como puede ver, la clase de colección SortedList implementa las interfaces Ithe IEnumerable, ICollection, IDictionary e ICloneable.

¿Cómo crear una lista ordenada en C#?

La clase SortedList de colección no genérica en C# proporciona seis constructores que podemos usar para crear una instancia de SortedList. Son los siguientes:

  1. ListaOrdenada(): Inicializa una nueva instancia de la clase System.Collections.SortedList que está vacía, tiene la capacidad inicial predeterminada y se ordena de acuerdo con la interfaz IComparable implementada por cada clave agregada al objeto System.Collections.SortedList.
  2. Lista ordenada (comparador IComparer): Inicializa una nueva instancia de la clase System.Collections.SortedList que está vacía, tiene la capacidad inicial predeterminada y se ordena según la interfaz IComparer especificada. El comparador de parámetros especifica la implementación System.Collections.IComparer que se usará al comparar claves. -o- null para usar la implementación System.IComparable de cada clave.
  3. Lista ordenada(IDictionary d): TI inicializa una nueva instancia de la clase System.Collections.SortedList que contiene elementos copiados del diccionario especificado, tiene la misma capacidad inicial que la cantidad de elementos copiados y se ordena de acuerdo con la interfaz System.IComparable implementada por cada clave. El parámetro d especifica la implementación System.Collections.IDictionary para copiar a un nuevo objeto System.Collections.SortedList.
  4. Lista ordenada(int initialCapacity): Inicializa una nueva instancia de la clase System.Collections.SortedList que está vacía, tiene la capacidad inicial especificada y se ordena de acuerdo con la interfaz System.IComparable implementada por cada clave agregada al objeto System.Collections.SortedList. El parámetro initialCapacity especifica el número inicial de elementos que puede contener el objeto System.Collections.SortedList.
  5. Lista ordenada (comparador IComparer, capacidad int): Inicializa una nueva instancia de la clase System.Collections.SortedList que está vacía, tiene la capacidad inicial especificada y se ordena de acuerdo con la interfaz System.Collections.IComparer especificada. El comparador de parámetros especifica la implementación System.Collections.IComparer que se usará al comparar claves. -o- null para usar la implementación System.IComparable de cada clave. La capacidad del parámetro especifica el número inicial de elementos que puede contener el objeto System.Collections.SortedList.
  6. SortedList(IDictionary d, comparador IComparer): Inicializa una nueva instancia de la clase System.Collections.SortedList que contiene elementos copiados del diccionario especificado, tiene la misma capacidad inicial que el número de elementos copiados y se ordena de acuerdo con la interfaz System.Collections.IComparer especificada. El parámetro d especifica la implementación de System.Collections.IDictionary para copiar en un nuevo objeto System.Collections.SortedList. El comparador de parámetros especifica la implementación System.Collections.IComparer que se usará al comparar claves. -o- null para usar la implementación System.IComparable de cada clave.

Veamos cómo crear una SortedList usando el constructor SortedList en C#:

Paso 1:
Como la clase SortedList pertenece al espacio de nombres System.Collections, primero debemos importar el espacio de nombres System.Collections a nuestro programa de la siguiente manera:
usando System.Collections;

Paso 2:
A continuación, debemos crear una instancia de la clase SortedList usando el constructor SortedList () de la siguiente manera:
SortedList sortedList =new SortedList();

¿Cómo agregar elementos a una lista ordenada en C#?

Si desea agregar un par clave/valor a una lista ordenada, debe usar el método Add() de la clase SortedList.

Añadir(clave de objeto, valor de objeto): El método Add(clave de objeto, valor de objeto) se usa para agregar un elemento con la clave y el valor especificados a una lista ordenada. Aquí, la clave del parámetro especifica la clave del elemento que se agregará y el valor del parámetro especifica el elemento que se agregará. El valor puede ser nulo.
SortedList sortedList =new SortedList();
ListaOrdenada.Add(1, “Uno”);
ListaOrdenada.Add(3, “Tres”);

También puede almacenar un par clave/valor en SortedList usando Collection Initializer de la siguiente manera.
SortedList sortedList =new SortedList
{
       { 1, “Uno” },
       { 3, “Tres” }
};

¿Cómo acceder a una lista ordenada en C#?

Podemos acceder a los pares clave/valor de SortedList en C# de tres formas diferentes. Son los siguientes:

Uso del bucle for para acceder a SortedList en C#:
Puede usar for loop en C# para acceder a los pares clave/valor de SortedList como se muestra a continuación.
for (int x =0; x
{
      Console.WriteLine($”Clave:{sortedList.GetKey(x)}, Value:{sortedList.GetByIndex(x)}”);
}

Uso de Index para acceder a SortedList en C#:
Puede acceder al valor individual de SortedList en C# mediante el índice. En este caso, necesitamos pasar la clave o el índice como parámetro para encontrar el valor respectivo. Si la clave especificada no está presente, el compilador lanzará una excepción. La sintaxis se proporciona a continuación.
Console.WriteLine($”Value at Index 1 is:{sortedList[1]}”);
cadena val =(cadena)listaOrdenada[1];
Consola.WriteLine(val);

Uso del bucle foreach para acceder a SortedList en C#:
También podemos usar un bucle for-each para acceder a los pares clave/valor de SortedList en C# de la siguiente manera.
foreach (elemento DictionaryEntry en sortedList)
{
        Consola.WriteLine($”Clave:{elemento.Clave}, Valor:{elemento.Valor}”);
}

Ejemplo para comprender cómo crear una lista ordenada y agregar elementos en C#:

Para comprender mejor cómo crear una lista ordenada y cómo agregar elementos a una lista ordenada en C#, y cómo acceder a los elementos, consulte el siguiente ejemplo.

using System;
using System.Collections;
namespace NonGenericCollections
{
    public class SortedListDemo
    {
        public static void Main(string[] args)
        {
            //Creating sortedList object
            SortedList sortedList = new SortedList();

            //Adding Elements to SortedList using Add
            sortedList.Add(1, "One");
            sortedList.Add(5, "Five");
            sortedList.Add(4, "Four");
            sortedList.Add(2, "Two");
            sortedList.Add(3, "Three");

            //Duplicate Key not allowed
            //System.ArgumentException: 'Item has already been added. Key in dictionary: '4'  Key being added: '4''
            //sortedList.Add(4, "Four");

            //Accessing SortedList using For loop
            Console.WriteLine("Accessing SortedList using For loop");
            for (int x = 0; x < sortedList.Count; x++)
            {
                Console.WriteLine($"Key: {sortedList.GetKey(x)}, Value: {sortedList.GetByIndex(x)}");
            }

            Console.WriteLine("\nAccessing SortedList using For Each loop");
            //Accessing SortedList using For Each loop
            foreach (DictionaryEntry item in sortedList)
            {
                Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
            }

            Console.WriteLine("\nAccessing SortedList using Index");
            Console.WriteLine($"Key: 1, Value: {sortedList[1]}");
            Console.WriteLine($"Key: 2, Value: {sortedList[2]}");
            Console.WriteLine($"Key: 3, Value: {sortedList[3]}");

            Console.ReadKey();
        }
    }
}
Salida:

Tenga en cuenta que aquí obtenemos el resultado en función del orden ascendente de las teclas.

Ejemplo de agregar elementos a una lista ordenada usando el inicializador de colección en C#:

En el siguiente ejemplo, estamos usando la sintaxis del inicializador de colección en lugar del método Add para agregar pares clave-valor en la lista ordenada en C#.

using System;
using System.Collections;
namespace NonGenericCollections
{
    public class SortedListDemo
    {
        public static void Main(string[] args)
        {
            //Creating sortedList using Object Initializer
            SortedList sortedList = new SortedList
            {
                { "Ind", "India" },
                { "USA", "United State of America" },
                { "SA", "South Africa" },
                { "PAK", "Pakistan" }
            };

            Console.WriteLine("SortedList Elements");
            foreach (DictionaryEntry item in sortedList)
            {
                Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
            }

            Console.ReadKey();
        }
    }
}
Salida:

¿Cómo eliminar elementos de una lista ordenada en C#?

La clase de colección Non_Generic SortedList en C# proporciona los siguientes métodos para eliminar elementos de SortedList.

  1. Eliminar (clave de objeto): Este método se usa para eliminar el elemento con la clave especificada de un objeto System.Collections.SortedList. La clave de parámetro especifica el elemento a eliminar.
  2. RemoveAt(índice int): Este método se usa para eliminar el elemento en el índice especificado de un objeto System.Collections.SortedList. El índice del parámetro especifica el elemento a eliminar. Es un índice basado en 0.
  3. Borrar() :este método se utiliza para eliminar todos los elementos de un objeto System.Collections.SortedList.

Veamos un ejemplo para comprender los métodos anteriores de la clase de colección SortedList en C#. Por favor, eche un vistazo al siguiente ejemplo.’

using System;
using System.Collections;
namespace NonGenericCollections
{
    public class SortedListDemo
    {
        public static void Main(string[] args)
        {
            //Creating sortedList object
            SortedList sortedList = new SortedList();

            //Adding Elements to SortedList using Add
            sortedList.Add("Ind", "India");
            sortedList.Add("USA", "United State of America");
            sortedList.Add("SA", "South Africa");
            sortedList.Add("PAK", "Pakistan");

            Console.WriteLine("SortedList Elements");
            foreach (DictionaryEntry item in sortedList)
            {
                Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
            }

            // Remove value having key PAK Using Remove() method
            sortedList.Remove("PAK");

            // After Remove() method
            Console.WriteLine("\nSortedList Elements After Remove Method");
            foreach (DictionaryEntry item in sortedList)
            {
                Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
            }

            // Remove element at index 1 Using RemoveAt() method
            sortedList.RemoveAt(1);
            Console.WriteLine("\nSortedList Elements After RemoveAT Method");
            foreach (DictionaryEntry item in sortedList)
            {
                Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
            }

            // Remove all key/value pairs Using Clear method
            sortedList.Clear();
            Console.WriteLine($"After Clear Method Total Key-Value Pair Present is : {sortedList.Count} ");
            Console.ReadKey();
        }
    }
}
Salida:

¿Cómo comprobar la disponibilidad de pares clave/valor en una lista ordenada en C#?

Si desea verificar si el par clave/valor existe o no en SortedList, puede usar los siguientes métodos de la clase SortedList.

  1. Contiene(clave de objeto): Este método se utiliza para determinar si el objeto SortedList contiene una clave específica. La clave de parámetro para ubicar en el objeto SortedList. Devuelve verdadero si el objeto SortedList contiene un elemento con la clave especificada; en caso contrario, falso. Si la clave es nula, arrojará System.ArgumentNullException.
  2. ContainsKey(clave de objeto): Este método se utiliza para determinar si un objeto SortedList contiene una clave específica. La clave de parámetro para ubicar en el objeto SortedList. Devuelve verdadero si el objeto SortedList contiene un elemento con la clave especificada; en caso contrario, falso. Si la clave es nula, arrojará System.ArgumentNullException.
  3. ContainsValue(valor del objeto): Este método se usa para determinar si un objeto System.Collections.SortedList contiene un valor específico. El valor del parámetro para ubicar en el objeto SortedList. El valor puede ser nulo. Devuelve verdadero si el objeto SortedList contiene un elemento con el valor especificado; de lo contrario, falso.

Entendamos esto con un ejemplo. El siguiente ejemplo muestra cómo usar el método contains, containskey y containsvalue de la clase de colección SortedList no genérica en C#.

using System;
using System.Collections;
namespace NonGenericCollections
{
    public class SortedListDemo
    {
        public static void Main(string[] args)
        {
            //Creating sortedList using Object Initializer
            SortedList sortedList = new SortedList
            {
                { "Ind", "India" },
                { "USA", "United State of America" },
                { "SA", "South Africa" },
                { "PAK", "Pakistan" }
            };

            //Checking the key using the Contains methid
            Console.WriteLine("Is Ind Key Exists : " + sortedList.Contains("Ind"));
            Console.WriteLine("Is NZ Key Exists : " + sortedList.Contains("NZ"));

            //Checking the key using the ContainsKey methid
            Console.WriteLine("Is Ind Key Exists : " + sortedList.ContainsKey("Ind"));
            Console.WriteLine("Is NZ Key Exists : " + sortedList.ContainsKey("NZ"));

            //Checking the value using the ContainsValue method
            Console.WriteLine("Is India value Exists : " + sortedList.ContainsValue("India"));
            Console.WriteLine("Is Bangladesh value Exists : " + sortedList.ContainsValue("Bangladesh"));

            Console.ReadKey();
        }
    }
}
Salida:

¿Cómo clonar la lista ordenada no genérica en C#?

Si desea clonar o copiar la lista ordenada no genérica en C#, debe usar el siguiente método Clone() proporcionado por la clase de colección SortedList.

  1. Clonar(): Este método se usa para crear y devolver una copia superficial de un objeto SortedList.

Para una mejor comprensión, por favor, eche un vistazo al siguiente ejemplo.

using System;
using System.Collections;
namespace NonGenericCollections
{
    public class SortedListDemo
    {
        public static void Main(string[] args)
        {
            //Creating sortedList using Object Initializer
            SortedList sortedList = new SortedList
            {
                { "Ind", "India" },
                { "USA", "United State of America" },
                { "SA", "South Africa" },
                { "PAK", "Pakistan" }
            };

            Console.WriteLine("Sorted List Elements:");
            foreach (DictionaryEntry item in sortedList)
            {
                Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
            }

            Console.WriteLine("\nCloned Sorted List Elements:");
            //Creating a clone sortedList using Clone method
            SortedList cloneSortedList = (SortedList)sortedList.Clone();
            foreach (DictionaryEntry item in cloneSortedList)
            {
                Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
            }

            Console.ReadKey();
        }
    }
}
Salida:

¿Cuál es el uso del método CopyTo de la clase de colección SortedList no genérica en C#?

Copiar a (matriz de matriz, índice de matriz int): El método CopyTo de la clase de colección SortedList no genérica en C# se usa para copiar elementos SortedList en un objeto Array unidimensional, comenzando en el índice especificado en la matriz. Aquí, la matriz de parámetros especifica el objeto Array unidimensional que es el destino de los objetos DictionaryEntry copiados de SortedList. El Array debe tener una indexación basada en cero. El parámetro arrayIndex especifica el índice de base cero en la matriz en el que comienza la copia. Si la matriz de parámetros es nula, generará ArgumentNullException. Si el parámetro arrayIndex es menor que cero, arrojará ArgumentOutOfRangeException.

Los pares clave/valor se copian en el objeto Array en el mismo orden en que el enumerador recorre el objeto SortedList. Este método es una operación O(n), donde n es Count.

  1. Para copiar solo las claves en SortedList, use SortedList.Keys.CopyTo.
  2. Para copiar solo los valores en SortedList, use SortedList.Values.CopyTo.

Para una mejor comprensión, por favor, eche un vistazo al siguiente ejemplo.

using System;
using System.Collections;

namespace NonGenericCollections
{
    public class SortedListDemo
    {
        public static void Main(string[] args)
        {
            //Creating sortedList using Object Initializer
            SortedList sortedList = new SortedList
            {
                { "Ind", "India" },
                { "USA", "United State of America" },
                { "SA", "South Africa" },
                { "PAK", "Pakistan" }
            };

            Console.WriteLine("Sorted List Elements:");
            foreach (DictionaryEntry item in sortedList)
            {
                Console.WriteLine($"Key: {item.Key} : Value: {item.Value}");
            }

            DictionaryEntry[] myTargetArray = new DictionaryEntry[5];
            sortedList.CopyTo(myTargetArray, 1);
            Console.WriteLine("\nCopyTo Method to Copy Keys and values:");
            for (int i = 0; i < myTargetArray.Length; i++)
            {
                Console.WriteLine($"{myTargetArray[i].Key} : {myTargetArray[i].Value}");
            }

            Object[] myObjArrayKey = new Object[5];
            Object[] myObjArrayValue = new Object[5];

            Console.WriteLine("\nCopyTo Method to Copy Keys:");
            sortedList.Keys.CopyTo(myObjArrayKey, 0);
            foreach (var key in myObjArrayKey)
            {
                Console.WriteLine($"{key} ");
            }

            Console.WriteLine("\nCopyTo Method to Copy Values:");
            sortedList.Values.CopyTo(myObjArrayValue, 1);
            foreach (var key in myObjArrayValue)
            {
                Console.WriteLine($"{key} ");
            }
            Console.ReadKey();
        }
    }
}
Salida:

Propiedades de clase de colección SortedList no genéricas en C#
  1. Teclas :Obtiene las claves en un objeto System.Collections.SortedList. Devuelve un objeto System.Collections.ICollection que contiene las claves en el objeto System.Collections.SortedList.
  2. Está sincronizado :Obtiene un valor que indica si el acceso a un objeto SortedList está sincronizado (seguro para subprocesos). Devuelve verdadero si el acceso al objeto SortedList está sincronizado (seguro para subprocesos); en caso contrario, falso. El valor predeterminado es falso.
  3. Es de solo lectura :Obtiene un valor que indica si el objeto SortedList es de solo lectura. Devuelve verdadero si el objeto System.Collections.SortedList es de solo lectura; en caso contrario, falso. El valor predeterminado es falso.
  4. EsTamañoFijo :Devuelve verdadero si el objeto SortedList tiene un tamaño fijo; en caso contrario, falso. El valor predeterminado es falso.
  5. Contar :Devuelve el número de elementos contenidos en el objeto System.Collections.SortedList.
  6. Capacidad :Devuelve el número de elementos que puede contener el objeto System.Collections.SortedList.
  7. SyncRoot :Devuelve un objeto que se puede usar para sincronizar el acceso al objeto System.Collections.SortedList.
  8. Valores :Obtiene los valores en un objeto SortedList. Devuelve un objeto System.Collections.ICollection que contiene los valores del objeto System.Collections.SortedList.
¿Cuándo usar la colección SortedList no genérica en C#?

La colección de listas ordenadas no genéricas es una herramienta poderosa para realizar una manipulación rápida de datos clave-valor de manera ordenada. Pero hay ciertos escenarios en los que esta clase puede no ser adecuada. Por ejemplo, por su naturaleza, una SortedList siempre debe estar ordenada. Por lo tanto, cada vez que agregamos un nuevo par clave-valor a la lista o eliminamos un par clave-valor de SortedList, debe ordenarse para garantizar que todos los elementos estén en el orden correcto. Esto se vuelve más costoso a medida que aumentamos la cantidad de elementos en nuestra lista ordenada.

Solo debemos usar SortedList cuando queremos manejar colecciones más pequeñas que deben ordenarse en todo momento. Cuando se trata de colecciones más grandes, es más eficiente usar un diccionario, HashSet o incluso una lista regular que luego podemos ordenar una vez en el punto donde la necesitamos.

En el próximo artículo, voy a discutir las ventajas y desventajas de las clases de colección no genéricas en C# con ejemplos. Aquí, en este artículo, trato de explicar la clase SortedList de colección no genérica en C# con ejemplos. Espero que este artículo Clase de colección SortedList no genérica en C# con ejemplos lo ayude con sus necesidades. Me gustaría tener sus comentarios. Publique sus comentarios, preguntas o comentarios sobre este artículo.