92 - Colección : Dictionary<TKey, TValue>


Esta clase Dictionary<TKey, TValue> nos permite almacenar elementos asociando a cada clave un valor.

Para cada clave tenemos un valor asociado. Podemos después buscar fácilmente un valor para una determinada clave. Las claves en el diccionario no pueden repetirse.

Algunos ejemplos donde podríamos usar un diccionario:

  • Guardar en la clave las extensiones de archivos y en el valor los nombres de archivos que lo pueden abrir
  • En una agenda podemos guardar como 'clave' la fecha y hora y las actividades en el 'valor'.

Problema:

Almacenar un diccionario las palabras en castellano como 'clave' y las traducciones de las mismas en el 'valor'. Probar los métodos más significativos de la clase Dictionary<TKey, TValue>

Programa:

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

namespace Diccionario1
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary <string,string> dicc1 = new Dictionary<string,string> ();
            dicc1["rojo"]="red";
            dicc1["verde"]="green";
            dicc1["azul"]="blue";
            dicc1["blanco"]="whilte";
            foreach( KeyValuePair<string,string> elemento in dicc1)
                Console.WriteLine(elemento.Key + "=" + elemento.Value);
            if (dicc1.ContainsKey("rojo"))
                Console.WriteLine(dicc1["rojo"]);
            dicc1.Remove("rojo");
            if (dicc1.ContainsKey("rojo"))
                Console.WriteLine(dicc1["rojo"]);
            else
                Console.WriteLine("No existe la clave 'rojo'");
            
            Console.ReadKey();
        }
    }
}

En este problema tanto la clave como el valor son de tipo string, de todos modos pueden ser de otro tipo dependiendo el problema, la creación del objeto es:

            Dictionary <string,string> dicc1 = new Dictionary<string,string> ();

Para cargar elementos en el diccionario podemos indicar en el subíndice la clave y le asignamos el valor a guardar para dicho subíndice:

            dicc1["rojo"]="red";
            dicc1["verde"]="green";
            dicc1["azul"]="blue";
            dicc1["blanco"]="whilte";

También podríamos haber utilizado la llamada al método Add para obtener el mismo resultado:

            dicc1.Add("rojo", "red");
            dicc1.Add("verde", "green");
            dicc1.Add("azul", "blue");
            dicc1.Add("blanco", "white");

Para recorrer el diccionario en forma completa podemos utilizar el foreach y en cada ciclo nos retorna un objeto de tipo KeyValuePair<string,string>:

            foreach( KeyValuePair<string,string> elemento in dicc1)
                Console.WriteLine(elemento.Key + "=" + elemento.Value);

Para verificar si existe una determinada clave en el diccionario podemos hacerlo mediante el método ContainsKey y luego accedemos al valor de dicha clave mediante subíndice:

            if (dicc1.ContainsKey("rojo"))
                Console.WriteLine(dicc1["rojo"]);

Si necesitamos eliminar un elemento del diccionario lo hacemos con el método Remove pasando como parámetro la clave:

            dicc1.Remove("rojo");

Problema:

Almacenar un diccionario como 'clave' el código de producto y como valor objetos de la clase Producto que definan las propiedades 'Descripción' y 'Precio'. Almacenar varios artículos en el diccionario y luego imprimirlo.
Ingresar un código de artículo por teclado y luego mostrar su descripción y precio.

Programa:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Diccionario2
{
    class Producto
    {
        public String Descripcion { get; set; }
        public float Precio { get; set; }
    }

    class Program
    {


        static void Main(string[] args)
        {
            var articulos = new Dictionary<int, Producto>();
            articulos[1] = new Producto { Descripcion = "Papas", Precio = 12.67f };
            articulos[2] = new Producto { Descripcion = "Manzanas", Precio = 20f };
            articulos[3] = new Producto { Descripcion = "Naranjas", Precio = 25f };
            foreach (KeyValuePair<int, Producto> art in articulos)
                Console.WriteLine(art.Key + " " + art.Value.Descripcion + " " + art.Value.Precio);
            Console.Write("Ingrese el código de producto a consultar:");
            int codigo = int.Parse(Console.ReadLine());
            if (articulos.ContainsKey(codigo))
                Console.WriteLine(articulos[codigo].Descripcion + " " + articulos[codigo].Precio);
            else
                Console.WriteLine("No existe un artículo con dicho código");
            Console.ReadKey();
        }
    }
}

Declaramos la clase Producto con las propiedades 'Descripcion' y 'Precio':

    class Producto
    {
        public String Descripcion { get; set; }
        public float Precio { get; set; }
    }

Cremos un diccionario con clave de tipo 'int' y valor de tipo 'Producto':

            Dictionary<int, Producto> articulos = new Dictionary<int, Producto>();

Recordar si utilizamos tipos de datos implícitos podemos reducir la línea anterior con la sintaxis:

            var articulos = new Dictionary<int, Producto>();

Almacenamos tres elementos en el diccionario:

            articulos[1] = new Producto { Descripcion = "Papas", Precio = 12.67f };
            articulos[2] = new Producto { Descripcion = "Manzanas", Precio = 20f };
            articulos[3] = new Producto { Descripcion = "Naranjas", Precio = 25f };

Recorremos la colección e imprimimos sus datos:

            foreach (KeyValuePair<int, Producto> art in articulos)
                Console.WriteLine(art.Key + " " + art.Value.Descripcion + " " + art.Value.Precio);

Para la consulta utilizamos el método 'ContainsKey' de la clase Dictionary:

            Console.Write("Ingrese el código de producto a consultar:");
            int codigo = int.Parse(Console.ReadLine());
            if (articulos.ContainsKey(codigo))
                Console.WriteLine(articulos[codigo].Descripcion + " " + articulos[codigo].Precio);
            else
                Console.WriteLine("No existe un artículo con dicho código");

Retornar