Ordenar un diccionario por sus claves en C#

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Utilice el método LINQ OrderBy() para ordenar un diccionario por sus claves en C#
  2. Utilice la clase SortedList<TKey, TValue> para ordenar un diccionario por sus claves en C#
  3. Use la clase SortedDictionary<TKey, TValue> para ordenar un diccionario por sus claves en C#
Ordenar un diccionario por sus claves en C#

En C#, un diccionario permite búsquedas en tiempo casi constante que reflejan su implementación como una tabla hash, lo que significa que también está intrínsecamente desordenado. Puede adquirir por separado los elementos de un diccionario para clasificarlos, ya que un diccionario no tiene un método de clasificación predefinido.

El primer método es utilizar el método LINQ OrderBy(); sin embargo, no tiene el mejor rendimiento O(n*log(n)) ya que necesita ordenar todas las entradas. Si necesita acceso repetido a los elementos del diccionario por clave, use SortedList o SortedDictionary porque pueden ayudarlo a lograr este propósito sin comprometer la calidad.

Puede perder algo de rendimiento en los tiempos de búsqueda e inserción al extraer la lista de elementos en orden en tiempo lineal O(n). En este tutorial, aprenderá tres métodos posibles para ordenar un diccionario por sus claves en C#.

Utilice el método LINQ OrderBy() para ordenar un diccionario por sus claves en C#

Este método LINQ permite a los programadores extraer un IOrderedEnumerable de KeyValueParts de un diccionario para ordenarlo por sus claves. Como un diccionario no puede almacenar elementos en orden, la ordenación de un diccionario será O(n*log(n)).

Los métodos LINQ pertenecen al espacio de nombres System.Linq y pueden permitirle procesar fácilmente cada par clave-valor para cada clave en el diccionario ordenado. El método OrderBy se implementa mediante ejecución diferida e inmediatamente devuelve un objeto que almacena toda la información necesaria para ordenar un diccionario.

Realiza una ordenación estable, y si las claves de dos elementos son iguales, se conserva el orden de los elementos.

Código de ejemplo:

using System;
using System.Linq;
using System.Collections.Generic;

public class sortOrderBy {
  public static void Main(string[] args) {
    var metal = new Dictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal.OrderBy(x => x.Key)) {
      Console.WriteLine(console);
    }
  }
}

Producción :

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

Un método LINQ alternativo a OrderBy es OrderByDesending, que hace lo que sugiere su nombre: invierte el orden. Como es un tipo de IOrderedEnumerable<TElement>, los métodos ThenBy y ThenByDescending también le permiten especificar criterios de clasificación adicionales para clasificar un diccionario.

Además, el método Reverse de LINQ es un equivalente del método OrderByDescending para ordenar un diccionario en orden descendente.

Código de ejemplo:

using System;
using System.Linq;
using System.Collections.Generic;

public class sortOrderByDescending {
  public static void Main(string[] args) {
    var metal = new Dictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    // LINQ `Reverse` method, which gives the similar output
    /*
    foreach (var item in fruit.Reverse())
    {
        Console.WriteLine(console);
    }
    */

    foreach (var console in metal.OrderByDescending(x => x.Key)) {
      Console.WriteLine(console);
    }
  }
}

Producción :

[Titanium, 3]
[Platinum, 7]
[Aluminum, 4]

Utilice la clase SortedList<TKey, TValue> para ordenar un diccionario por sus claves en C#

Su nombre puede resultar engañoso para algunos, ya que este método o estructura de datos asigna claves a sus valores y puede actuar de manera similar a un diccionario. Utiliza un enfoque de búsqueda binaria para encontrar valores por claves y almacenarlos en un orden particular para ordenar un diccionario.

Puede usar el método SortedList<TKey, TValue> para ordenar un diccionario por clave de forma configurable en caso de que pase un IEqualityComparer<T> al constructor. Internamente, se implementa usando una lista de manera efectiva, por lo que en lugar de buscar por código hash, realiza una búsqueda binaria.

Que sea útil no significa que esté optimizado en términos de rendimiento, ya que puede crear una lista grande pero puede evitar la complejidad. Pertenece al espacio de nombres System.Collections.Generic y se basa en la implementación asociada IComparer<T>.

Código de ejemplo:

using System;
using System.Collections.Generic;

public class sortedListExp {
  public static void Main(string[] args) {
    var metal = new SortedList<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal) {
      Console.WriteLine(console);
    }
  }
}

Producción :

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

Use la clase SortedDictionary<TKey, TValue> para ordenar un diccionario por sus claves en C#

Representa un diccionario donde los pares clave-valor se ordenan en la clave, ya que se implementa como un árbol de búsqueda binaria con una operación de recuperación de tiempo logarítmico. Inicializa una nueva instancia de un diccionario (que contiene el mismo mapeo que el diccionario especificado) y lo ordena de acuerdo con sus claves.

Pertenece a una clase Genérica, un árbol de búsqueda binaria con recuperación O(log n), donde n representa el número de elementos en el diccionario. Es similar a SortedList<TKey, TValue> pero tiene operaciones de inserción y eliminación más rápidas para datos no ordenados.

Como se implementa como un árbol Rojo-Negro, mientras que un diccionario se implementa como una tabla hash, el uso de Diccionario clasificado puede afectar negativamente el rendimiento. Sin embargo, si no hay una diferencia de rendimiento significativa, el uso de Diccionario clasificado puede causar menos confusión.

Código de ejemplo:

using System;
using System.Collections.Generic;

public class sortedDictionaryExp {
  public static void Main(string[] args) {
    var metal = new SortedDictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal) {
      Console.WriteLine(console);
    }
  }
}

Producción :

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

Este tutorial contiene todo lo necesario para discutir cómo ordenar un diccionario por sus claves, y podría aclarar cualquier confusión que pudiera haber sobre este tema. Además, es posible que haya llamado su atención sobre algunos métodos o estructuras de datos nuevos para cumplir con esta tarea y mantener el máximo rendimiento.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

Artículo relacionado - Csharp Dictionary