Convertir lista en diccionario en C#

Rana Hasnain Khan 12 octubre 2023
  1. Convertir lista en diccionario en C#
  2. Convertir lista en diccionario usando el método LINQ ToDictionary() en C#
  3. Convertir lista a diccionario usando el método Non-Linq en C#
Convertir lista en diccionario en C#

En este artículo, aprenderemos cómo podemos convertir una lista en un diccionario usando ToDictionary(), y también obtendremos una idea de cómo podemos lidiar con claves duplicadas.

Convertir lista en diccionario en C#

Hay muchas situaciones en las que puede que tengamos que convertir una lista en un diccionario. Existen algunos métodos con la ayuda de los cuales podemos convertir fácilmente una lista en un diccionario.

Discutiremos estos métodos en detalle con ejemplos a continuación.

Convertir lista en diccionario usando el método LINQ ToDictionary() en C#

La forma más sencilla de convertir una lista en un diccionario es a través del método LINQ ToDictionary(), que se muestra a continuación.

Código de ejemplo:

#Csharp
using System.Linq;

var seasonList = GetSeasonsList();
var seasonsById = seasonList.ToDictionary(keySelector: s => S.Id, elementSelector: s => s);

Esto funciona haciendo un bucle dentro de la lista y utilizará el selector de clave/elemento lambdas, que hemos arreglado para formar el diccionario.

Aquí se mencionan los parámetros keySelector y elementSelector de esta forma para facilitar su lectura.

Convertir lista a diccionario usando el método Non-Linq en C#

También podemos convertir una lista en un diccionario de forma no LINQ mediante un bucle.

Código de ejemplo:

#Csharp
var seasons = GetSeasonList();
var seasonById = new Dictionary<int, Season>();

foreach (var season in seasons) {
  seasonById.Add(season.Id, season);
}

Se recomienda usar el método que no es LINQ porque tiene un rendimiento mejorado, pero podemos usar cualquier método según nuestras preferencias.

En estos métodos se pueden utilizar dos tipos de selectores de elementos. Uno es un selector de elementos implícito y el otro es un selector de elementos explícito.

Cuando usamos estas dos declaraciones, el resultado será el mismo. Usemos un selector de elementos implícito, como se muestra a continuación.

Código de ejemplo:

#Csharp
var seasonsById = seasonList.ToDictionary(keySelector: s => s.Id, elementSelector: s => s);

Usemos un selector de elementos explícito, como se muestra a continuación.

Código de ejemplo:

#Csharp
var seasonById = seasonList.ToDictionary(keySelector: s => s.Id);

El selector de elementos utilizará robóticamente los elementos de la lista como elementos si no los ha definido. Esto puede ser lo que desea al marcar objetos por una de sus propiedades.

Claves duplicadas en C#

La lista puede tener una clave duplicada. En este escenario, ToDictionary() mostrará una excepción que es System.ArgumentException.

Muestra que un elemento que posee la misma clave ya está en la lista cuando intentamos agregar una clave duplicada con la ayuda del código que se muestra a continuación.

Sintaxis:

#Csharp
Dictionary.Add(key, value)

Obtendremos la misma excepción usando el código que se muestra arriba. Esta es la misma excepción que obtenemos cuando intentamos insertar una clave duplicada usando Dictionary.Add(key, value).

Por excepción, podemos evitar claves duplicadas en nuestros datos.

Si queremos claves duplicadas en nuestros datos, debemos agruparlas por clave y seleccionar lo que queremos para el valor. Veamos algunas opciones como se explica a continuación.

un Valor Agregado para la Clave en C#

En primer lugar, estimaremos los recuentos de artículos. Podemos repetir palabras.

Para lograr esto, necesitamos agrupar por palabra, y debemos configurar el conteo como un agregado.

Veamos un ejemplo en el que usaremos esto para buscar claves duplicadas, como se muestra a continuación.

Código de ejemplo:

#Csharp
var seasons = new List<string> { "You", "Breaking Bad", "Marvel", "You" };

var seasonCountMap =
    seasons.GroupBy(s => s).ToDictionary(keySelector: m => m.Key, elementSelector: m => m.Count());

foreach (var seasonCount in seasonCountMap) {
  Console.WriteLine($"{seasonCount.Key}={seasonCount.Value}");
}

Producción:

claves duplicadas en C

Lista de Elementos para Clave en C#

Aquí catalogaremos algunas temporadas según su año de estreno. Puede haber muchas temporadas lanzadas cada año.

Para lograr un diccionario de listas, podemos usar el siguiente código como se muestra a continuación.

Código de ejemplo:

#Csharp
var seasonList = GetSeasonList();
var seasonByYear = seasonList.GroupBy(s => s.YearOfRelease)
                       .ToDictionary(keySelector: m => m.Key, elementSelector: m => m.ToList());

foreach (var seasonGroup in seasonByYear) {
  Console.WriteLine(
      $"{seasonGroup.Key}={string.Join(", ", seasonGroup.Value.Select(v => v.Name))}");
}

Primer elemento con la clave en C#

Tenemos que elegir uno de los elementos para describir el grupo en caso de llaves duplicadas. Podemos elegir al primer elemento del grupo como representante.

Veamos un ejemplo. Como se muestra a continuación, hemos enumerado las temporadas por año y hemos seleccionado solo una temporada por año.

Código de ejemplo:

#Csharp
var seasonList = GetSeasonList();

var seasonsByYear = seasonList.GroupBy(s => s.YearOfRelease)
                        .ToDictionary(keySelector: m => m.Key, elementSelector: m => m.First());

Foreach(var season in seasonsByYear) {
  Console.WriteLine($"{season.Key}={season.Value.Name}");
}

Compruebe los duplicados mediante bucles en C#

Debe verificar si la clave está presente cuando usa el método de bucle en lugar del método LINQ. Con esto, lidiará fácilmente con los duplicados.

Y tienes total libertad para elegir cómo quieres tratar los duplicados.

Código de ejemplo:

#Csharp
using System.IO;
using System;

class Program {
  static void Main() {
    var seasons = GetSeasonList();
    var seasonsByYear = new Dictionary<int, List<Season>>();
    foreach (var season in seasons) {
      if (!seasonByYear.ContainsKey(season.YearOfRelease)) {
        seasonByYear.Add(season.YearOfRelease, new List<Season>());
      }
      seasonByYear[season.YearOfRelease].Add(season);
    }
    foreach (var seasonGroup in seasonByYear) {
      Console.WriteLine(
          $"{seasonGroup.Key}={string.Join(", ", seasonGroup.Value.Select(m =>m.Name))}");
    }
  }
}

En este ejemplo, se ha creado una lista de temporadas lanzadas cada año. Cuando la función nota que la clave aún no se ha especificado, la presenta con una lista vacía y luego le agrega temporada.

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

Artículo relacionado - Csharp Dictionary

Artículo relacionado - Csharp List