jueves, 23 de julio de 2009

Crear un Diccionario de datos de tipo Clave/Valor en Visual C#

Vamos a crear una estructura de datos de tipo "Diccionario de pares Clave/Valor" (un tipo Dictionary) en el que tanto el tipo de dato de la Clave como del Valor serán de tipo String (aunque podrían ser de cualquier otro tipo).

Estas estructuras son útiles cuando se precisa almacenar y recuperar datos que deban estar relacionados en pares de valores. Por ejemplo, el nombre de una serie de personas con su DNI, ó
el nombre de una serie de artículos con su precio, etc.

Cada par de datos Clave/Valor se almacenan dentro del Diccionario como una estructura de datos denominada "KeyValuePair" (TKey, TValue).

Los diccionarios de datos se suelen utilizar cuando sólo se necesitan algunas de las propiedades (Claves) de algún objeto de una Clase previamente definida y sus Valores correspondientes, aunque no hay ningún inconveniente en utilizarlo para guardar todas las propiedades del objeto.

En este caso crearemos un "Dictionary" para guardar los valores de varias propiedades de un supuesto objeto de tipo "libro". Veamos el código:


   1:  public Dictionary<string, string> CargarDiccionario()
   2:          {
   3:              //Creamos una estructura de datos de tipo "Dictionary":
   4:              Dictionary<string, string> miDic = new Dictionary<string, string>();
   5:   
   6:              //Supongamos que necesitamos guardar tres propiedades (codigo, titulo y precio) que vamos añadiendo al Diccionario con sus correspondientes valores (por ejemplo, 2442, D. Quijote de la Mancha, 52). Cuando el valor es de tipo numérico lo convertimos previamente a tipo string
   7:              miDic.Add("codigo", Convert.ToString(2442));    
   8:              miDic.Add("titulo", "D. Quijote de la Mancha");  
   9:              miDic.Add("precio", Convert.ToString(52));
  10:   
  11:              RecorrerDiccionario(miDic);
  12:   
  13:              return miDic;
  14:          }


Para recuperar los datos almacenados en un Diccionario de pares de Clave/Valor habrá que recorrer cada uno de sus elementos "KeyValuePair" utilizando un bucle "for each". En este caso sencillamente realizamos la lectura y escribimos los datos en la secuencia de salida standard:

   1:  public void RecorrerDiccionario(Dictionary<string, string> elDic)
   2:          {
   3:              foreach (KeyValuePair<string, string> kvp in elDic)
   4:              {
   5:                  Console.Write(kvp.Key);
   6:                  Console.Write(kvp.Value);
   7:              }
   8:          }

3 comentarios:

  1. hola men q tal, mira, tengo un problema de transaccion entre c# y sql server en un aplicacion winform, estoy trabajando con 3 capas, el problema q tengo son para mostrar en un datagridview los datos q tengo en una tabla el problema es q esa tabla contiene algunos valores nulos, eh he hecho en VB una clase para el control de esas variables nulas pero no se hacerlo en c#, mejor dicho no se como diseñar esta clase, se q c# y visual basic tienen mucho en comun pero soy un practicamente principiante en esto y tengo idea de como hacer esto y no encuentro nuinguna ayuda enningun lado con rtespecto a estoy pos no se si me pudieras ayudar, eh subido a rapidshare la aplicacion para q la puedas chekear ya q en esa aplicacion tiene tres clases y un form y seria tedioso poner clase por clase en este comentario ah!! y por q lo q eh visto en muchos foros hay varios que tienen este problema haber si nos das una manito, visitarte tu blog todos los dias pa ver si me pudistes ayudar y ya de paso pos aviso a la gente de los demas foros q vean tu blog. Aca te dejo el link de descarga de la aplicacion alli dentro tambien esta la clase q hice en visual basic con su respectivo uso:

    http://rapidshare.com/files/262662230/Q_Problema.rar.html

    espero me pueda ayudar, de antemano muchas gracias...

    ResponderEliminar
  2. Bueno Jonathan, veamos. Sin entrar a analizar a fondo tu código (que siempre es arduo y complejo) yo realizaría una modificación sustancial. Te explico:

    Tu utilizas un objeto "SqlDataReader" para guardar el resultado de la consulta y, posteriormente, añades la lectura de cada campo a una colección de tipo "List".

    Yo, en cambio, almacenaría el resultado de la consulta en un objeto "DataView" utilizando, asímismo, un objeto "DataTable" y un objeto "SqlDataAdapter" (un adaptador):

    public DataView ListarClientesModificado(SqlConnection cnn)
    {
    SqlCommand sqlCmd;
    SqlDataAdapter sqlDadp = null;
    DataTable dt = new DataTable();
    DataView dtVw = new DataView(dt);

    try
    {
    sqlCmd = new SqlCommand("Nombre_Procedimiento", cnn);
    sqlDadp.Fill(dt); //Ejecuta la consulta y la adapta a un "DataTable" definido como "dt"
    return dtVw = dt.DefaultView; //COnvierte la consulta en una vista (en un tipo "DataView")
    }
    catch (Exception)
    {
    return null;
    }
    }

    Finalmente, realizaría la comprobación de los campos nulos sobre cada Registro (fila) del DataView:

    public void ComprobarValoresNulos(DataView dtVw)
    {
    if (dtVw.Count != 0)//Si la consulta devuelve alguna fila
    {
    if (dtVw.Table.Rows[0]["NombreCampo"] != DBNull.Value) //Si el campo "NombreCampo" no tiene un valor nulo
    this._NombreCampo = dtVw.Table.Rows[0]["NombreCampo"].ToString();//Se le asigna su valor a la propiedad "_NombreCampo" del objeto que estamos construyendo
    else
    this._NombreCampo = string.Empty;//En caso contrario le asignamos una cadena vacía

    //Y repites la operación para cada campo de tu tabla
    }
    }

    Espero que esta respuesta te sea útil. De todos modos, presta atención en los próximos días a las entradas del Blog porque te prometo insertar una Entrada con un ejemplo más completo.

    Un saludo desde España.

    ResponderEliminar
  3. ok men voy a probar esto, ojala me sea de utikidad y creo q lo sera ya que esta muy bien explicadito, gracias y estare visitando tu blog a diario pa ver las nuevas novedades q siempre posteas... gracias

    ResponderEliminar

Webs amigas:
Eduardo Soriano
Solcan
Taller de Joyería