miércoles, 27 de diciembre de 2017

Receta Python No. 1-2: Comparación de Cadenas de Caracteres (Strings)

1. Problema

Comparar dos cadenas de caracteres y comprobar si son iguales; o determinar si dos variables de cadenas de caracteres apuntan a un mismo objeto de tipo String.

2. Solución

En Python nos encontramos con dos mecanismos que permiten realizar las operaciones anteriores:
  1. Operador ==: comprueba si dos cadenas de caracteres son iguales.
  2. Operador is: comprueba si dos cadenas de caracteres apuntan al mismo objeto de tipo String.

3. Código Python

Con el código:

Archivo Python cadenas-igualdad.py [enlace alternativo]:

se retorna el valor Las cadenas de caracters son iguales. Y esto a razón de que el contenido no es igual: en Python hay diferencia entre mayúsculas y minúsculas respecto a los caracteres de una cadena de caracteres.


Por otra parte, con el operador is se puede comprobar si dos variables apuntan a un mismo objeto String:

Archivo Python operador-is.py [enlace alternativo]:
Aquí se retorna se imprime en pantalla Dostoevsky es el escritor de Memorias del subsuelo. Tanto la variable escritor como autorMemoriasSubsuelo apuntan a la misma dirección.

4. Literatura & Enlaces

Bernard J. (2016). Python Recipes Handbook: A Problem-Solution Approach. Canada: Apress.
O

lunes, 25 de diciembre de 2017

Receta Python No. 1-1: Concatenación de Cadenas de Caracteres (String)

1. Problema

Crear una cadena de caracteres compuesta de variables o literales.

2. Solución

En Python el programador cuenta con el operador +. También el operador sobrecargado * para multiplicar o reproducir una cadena de caracteres cierto número de veces (tal como se indique por una constante multiplicadora).

3. Código Python

Se concatena el nombre y el apellido del escritor ruso Fyodor Dostoevsky usando el operador +:

escritor = 'Fyodor' + ' ' + 'Dostoevsky'
print (escritor)

Nótese que la variable escritor contendrá el resultado de unir las tres literales de cadenas de caracteres.

Resultado: Fyodor Dostoevsky

También se puede utilizar el operaador * para reproducir o multiplicar una cadena de caracteres:

web = 'W' * 3
print (web)

Resultado: WWW

Adicionalmente, para concatenar valores procedentes de variables o literales con tipo de dato (implícito) distinto a string (o cadena de caracteres) se puede utilizar la función str (Bernard, 2016):

w3c = 'W' + str(3) + 'C'
print (w3c)

Resultado: W3C

4. Literatura & Enlaces

Bernard J. (2016). Python Recipes Handbook: A Problem-Solution Approach. Canada: Apress.

O

Bienvenidos a Recetas Python

Índice

1. Introducción
2. Palabras Clave
3. Recetas Python

1. Introducción

A partir de esta entrada el lector podrá aprender, comprender, aplicar y disfrutar el conocimiento del lenguaje de programación interpretado Python. El aprendizaje se realizará a través de la metología de recetas: el contenido de la receta empieza por el plantemiento de un problema hasta alcanzar una solución de código efectiva.

2. Palabras Clave

  • Aprendizaje
  • Conocimiento
  • Problema
  • Python
  • Receta
  • Solución

3. Recetas Python

Los contenidos que se desarrollarán harán uso del lenguaje de programación interpretado Python: un lenguaje que juego un rol importante en la solución problemas de forma efectiva para diferentes contextos: aplicaciones Web, de escritorio, scripting, automatización de tareas, ciencia de datos (data science), entre otras tareas de relavante interés.

La metodología de desarrollo de contenidos consiste en recetas. Una receta se caracteriza por 4 partes fundamentales:
  1. Problema
  2. Solución
  3. Discusión de la solución
  4. Práctica: Código Python
Esta forma documental facilita al lector la consulta, referenciación, y aplicación de códigos esenciales para tareas comunes que se realizan en este lenguaje de programa; por ejemplo:
  1. Cadenas de caracteres
  2. Números, Fechas y horas
  3. Generadores e iteradores
  4. Manipulación de archivos
  5. Análisis de datos
  6. Funciones
  7. Programación orientada a objetos
  8. Metaprogramación
  9. Red e Internet
  10. Módulos y paquetes
  11. Librería Numpy
  12. Utilidades
  13. Testing
  14. Extensiones y lenguaje C
  15. Arduino y Raspi
Espero que estos contenidos contribuyan a estudiantes y profesionales a mejorar sus habilidades en este magnífico lenguaje de programación que es Python.



O

lunes, 4 de diciembre de 2017

Receta T-SQL No. 5-5: Crear un Cubo Multidimensional para un Resultado

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
6. Práctica: Subtotal de Productos
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Con esta receta T-SQL se pretende mostrar cómo sumarizar un conjunto de resultados en un cubo multidimensional. Esta operación es de importante interés para obtener totales a partir de la combinación o agrupación de varias columnas respecto a otra que representa una cantidad, un valor, etc. Se usará el operador CUBE.

2. Palabras Clave

  • Combinación
  • Cubo
  • Multidimensional
  • Resumen

3. Problema


Se requiere obtener los subtotales a partir de todas las combinaciones posibles de las columnas Traje y Color. Los datos con los que se cuentan son:
Datos a combinar
Tabla 1. Datos a combinar.

3. Solución

T-SQL cuenta con el operador CUBE para generar todas las posibles combinaciones a partir de los nombres de columnas especificados como argumentos.

4. Discusión de la Solución

CUBE ("GROUPING (Transact-SQL)", 2017) es un operador de la cláusula GROUP BY, con el cual podemos obtener todas las combinaciones posibles de columnas. Las columnas se especifican como argumentos.

Para el caso que se requiere resolver es necesario crear la siguiente combinación:

...GROUP BY CUBE(Traje, Color)

Pero además en la cláusula SELECT se ha de especificar la columna que se quiere sumarizar o agregar:

SELECT Traje, Color, SUM(Cantidad) AS SumaCantidades ...

Nótese cómo ha resaltado la tercera columna. Esta columna contendrá la suma de los datos combinados; por ejemplo 350 que será el total de la combinación de las blusas tanto de color rojo como amarillo.

5. Práctica: Subtotal de Productos

El código T-SQL para obtener le resultado requerido es, entonces:

SELECT Traje, Color, SUM(Cantidad) AS SumaCantidades
    FROM Producto
    GROUP BY CUBE(Traje, Color);

Una vez ejecutemos esta sentencia, obtendremos:
Resultado combinación con CUBE
Tabla 2. Resultado combinación con CUBE.

La fila que contiene el valor NULL para las columnas Traje y Color el total de blusas y camisas que ya sean de color amarillo o rojo es de 850. Que es lo mismo que sumar la columna Cantidad de la Tabla 1.

7. Conclusiones

A través de esta receta el lector ha comprendido los básicos de combinaciones de columnas para obtener subtotales a través del operador CUBE de la cláusula GROUP BY.

8. Literatura & Enlaces

Brimhall, J., Dye, D., Gennick, J., Roberts, A., Sheffield, W. (2012). SQL Server 2012 T-SQL Recipes - A Problem-Solution Approach. United States: Apress.
GROUPING (Transact-SQL) | Microsoft Docs (2017). Recuperado desde: https://docs.microsoft.com/en-us/sql/t-sql/functions/grouping-transact-sql


O

martes, 28 de noviembre de 2017

Receta MATLAB No. 1-0: Generalidades de MATLAB

Índice

1. Introducción
2. Palabras Clave
3. Generalidades
4. Historia
5. Matrices Todo el Tiempo
6. Cadenas de Caracteres
7. Estructuras de Datos
8. Arreglos
9. Arreglos Lógicos
10. Ámbitos de Variables
11. Operadores y Palabras Clave
12. Conclusiones
13. Literatura & Enlaces

1. Introducción

En lugar de una receta, esta primer documento pretende esbozar las generalidades de los temas que se practicarán a lo largo de la serie de recetas Codificación. Aquí el lector ganará una vista general y podrá notar la forma de trabajo de esta técnica basada en recetas.


Se aprovecha este documento para exponer las generalidades del lenguaje de programación incorporado en MATLAB para manipular símbolos.

2. Palabras Clave

  • Arreglo
  • Codificación
  • Java
  • MATLAB
  • Operador
  • Receta

3. Generalidades

El lector se familiarizará con los siguientes aspectos esenciales de MATLAB:
  • Sintaxis
  • Programación
  • Características principales
  • Espacio de trabajo
De vital importancia será conocer la evolución que ha evidenciado MATLAB en los últimos años. Ya no se considera un paquete para hacer manipulación tipos de datos basados en matrices. Ahora se pueden mencionar características como:
  • Tipos de datos enteros, punto flotante
  • Estructuras de datos
  • Programación orientada a objetos
  • Integración con el lenguaje de programación Java, Python y C++
  • Clases

En la versión más reciente, R2017b (Introducción a Recetas MATLAB), se evidencia una entorno de trabajo basado en cintas (ribbon), y claramente sofisticado:
Ventana principal de MATLAB
Figura 1. Ventana principal de MATLAB.
Este entorno posee completas capacidades para soportar el trabajo de un desarrollador o programador:
  • Editor inteligente para código fuente
  • Analizador de código
  • Depurador
  • Log de actividades
  • Historial de comandos introducidos

4. Historia

MATLAB fue creado por un profesor alrededor del año 1970. El primer objetivo era ofrecer capacidades de manipulación sobre matrices. Su nombre procede MATrix LABoratory. Su evolución le ha llevado incluir un conjunto de librerías bajo el nombre LAPACK (Linear Algebra Package).

5. Matrices todo el Tiempo

El tipo de dato por defecto es la matriz de doble precisón. Por lo tanto, el programador no requiere especificar el tipo de dato a la hora de declarar el nombre de una variable.

Este ejemplo crea una matriz cuadrada de 3 x 3:

a = [7 3 4; 9 5 1; 7 8 6];

Cada fila de la matriz está separada por un punto y coma (;).

Para acceder a un elemento específico de la matriz basta con escribir:

a(2, 2);

Con este comando se obtiene el valor 5.

Las operaciones matriciales comunes como potencia de una matriz, matriz transpuesta, o suma o producto de matrices se puede computar asi:

b = a' * a;
c = a ^ 2;
d = b + c;

6. Cadenas de Caracteres

Definir una cadena de caracteres es supremamente sencillo:

nombre = 'Fyodor';
apellido = 'Dostoevsky';
nombreCompleto = [nombre apellido];

Nótese que la concatenación de cadenas de caracteres es muy fácil: en el último comando se especifica entre paréntisis angulares, y separados por espacio, las variables o literales que se quieren concatenar.

En la Tabla 1 (Paluszek et Thomas, 2015) se definen algunas funciones interesantes para tratar valores de este tipo de dato:
Funciones de cadenas de caracteres
Tabla 1. Funciones de cadenas de caracteres (Paluszek et Thomas, 2015).

7. Estructuras de Datos

Para definir una estructura de datos se recomienda usar una función donde se definan los campos y, eventualmente, valores de inicialización o por defecto:

e = Estructura;
e(2) = Estructura;

function e = Estructura
e =   struct ; 
e.campo1 = 32.0;  
e.campo2 = 'Dostoevsky'; 
end

En este fragmento de código se define una estructura que contiene dos campos. Esta forma de encapsular o relacionar datos es lo que permite referirse a una entidad de forma únivoca y ordenada.

8. Arreglos

Los arreglos en MATLAB son la estructura de datos por excelencia para contener cualquier tipo de dato. Se pueden formar vectores, matrices bidimensionales o multidimensionales.

La forma de declarar un arreglo se logra a través de

numeroPrimos = [2 3 5 7 11];

numerosPares = [2 4 6; 8 10 12; 14 16 18];

La primera expresión crea un arreglo unidimensional, mientras que la segunda una matriz de 3x3.

Para acceder a un elemento basta con usar

numerosPrimos(4)

9. Arreglos lógicos

Una arreglo lógico en MATLAB está únicamente compuesto por ceros y unos. Para inicializarlos se puede especificar un valor lógico: verdadero => 1, false => 0. Y existen funciones para determinar si un arreglo es lógico:

isLogical(arregloLogico);

10. Ámbitos de Variables

Las variables declaradas dentro de una función tienen ámbito o contexto local; mientras que aquellas declaradas por fuera de cualquier función, o en un script tienen ámbito global.

11. Operadores y Palabras Clave

MATLAB cuenta con una variedad de operadores y palabras claves para la manipulación de datos y estructuras de datos. Entre ellas tenemos:

11.1 Coma

La coma (,) se utiliza para la creación de una lista de índices. Ejemplo de uso:

arreglo(1, 1:2);

arreglo(:, 1)

La primera expresión retorna una lista, mientras que la segunda obtiene todos los elementos de una dimensión. Nótese que arreglo(1, 1:2) la coma está entre dos enteros: esta es la forma de crear una lista en MATLAB.

11.2 La crema

El operador ~ (o crema) es usado para negar valores lógicos. Supóngase que se tiene la siguiente matriz:

matriz = [0 1; 0 1]

Al aplicar la negación sobre esta matriz

~matriz

se obtiene

[1 0; 1 0]

11.3 Punto

El operador punto tiene un significado particular en MATLAB: .*, .\^..

Por ejemplo, para multiplicar los elementos de dos dos matrices es común recurrir a un ciclo for, pero a través del operador .* se puede lograr la multiplicación de uno a uno los elementos integrales de la matriz:

y = a .* b;

Esta expresión es más óptima que esta otra:

for k = 1:10
    y(k) = a(k) * b(k);
end

Existen otros operadores relevantes, aquí sólo se mencionan unos pocos, pero a medida que avancemos reconoceremos otra variedad interesante. Seguro que la exploración a través de recetas nos facilitará explotar los recursos computacionales que provee este magnífico lenguaje computacional e ir más allá.

12. Conclusiones

Esta receta introductoria nos abre camino a explorar el magnífico mundo de MATLAB: un lenguaje computacional usado en la academia y en la industria.

La siguientes entregas consistirán en el uso de elementos comunes y esenciales para el dominio de este lenguaje. ¡Así que preparados!

13. Literatura & Enlaces

Paluszek, M., Thomas, S. (2015). MATLAB Recipes: A Problem-Solution Approach. United States: Apress.
Introducción a Recetas MATLAB (2017). Recuperado desde: https://ortizol.blogspot.com.co/2017/11/introduccion-a-recetas-matlab.html


O

lunes, 27 de noviembre de 2017

Introducción a Recetas MATLAB

Índice

1. Introducción
2. Palabras Clave
3. Descarga
4. Instalacion
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

A partir de este momento los lectores de este blog podrán encontrar, ademá de temas relacionados con tecnologías de desarrollo de Microsoft, interesantes recetas acerca de MATLAB: un lenguaje computacional para la operación de estructuras en forma de matrices (cálculo matricial o álgebra lineal). Las recetas se concentran en el uso de los elementos del lenguaje, y la construcción de interfaces gráficas de usuario.



El uso de este software es común en la academia como en la investigación. El lector tendrá la oportunidad de acceder a contenido de aplicación directa en sus requerimientos computacionales sobre esta poderosa herramienta. Es posible que el lector encuentre elementos de MATLAB que jamás haya usado y que resulten prácticos y útiles para sus desarrollos o scripts.
Logo MATLAB
Figura 1. Logo MATLAB.

2. Palabras Clave

  • Álgebra Lineal
  • Cálculo matricial
  • Lenguaje copmptuacional
  • MATLAB
  • Receta
  • Software

3. Descarga

MATLAB puede ser descargado para un período de prueba de 30 días desde el siguiente enlace:

Desde aquí se puede descargar una versión de prueba para poner en práctica cualquier receta aquí descrita. En el momento de la redacción de este artículo se cuenta con la versión R2017b:
Descarga de MathWorks MATLAB
Figura 2. Descarga de MathWorks MATLAB.

4. Instalación

Para el proceso de instalación basta con seguir el asistente visual de instalación; solo basta que especifiquemos los componentes que deseamos instalar, la ruta de instalación (una unidad que contenga bastante espacio libre), e iniciar la instalación de los archivos de programa. Este proceso puede tomar hasta 60 minutos (depende esencialmente de los recursos hardware del sistema).

El proceso de activación puede realizarse a través de los datos del período de prueba (caso más común y que posiblemente sigan la mayoría de los lectores), o por medio de la llave entregada a la hora de la compra del producto.

5. Conclusiones

Se describió brevemente el propósito del proyecto de Recetas MATLAB. Futuras recetas introducirán los elementos de programación que provee este lenguaje computacional y lector se beneficiará de estos contenidos para su aprendizaje, trabajo o cualquier otra práctica.

¡Los espero!

6. Literatura & Enlaces

MATLAB - Wikipedia (2017). Recuperado desde: https://en.wikipedia.org/wiki/MATLAB
Download MATLAB, Simulink, Stateflow, and Other MathWorks Products (2017). Recuperdo desde: https://www.mathworks.com/downloads/


O

domingo, 26 de noviembre de 2017

Diccionarios en C# - Parte 2/6: IDictionary

Índice

1. Introducción
2. Palabras Clave
3. La Interfaz IDictionary
3.1 Generalidades
3.2 Propiedades y métodos sobresalientes
3.3 Diferencias frente a la versión genérica
4. Conclusiones
5. Literatura & Enlaces

1. Introducción

Estudiáremos en este artículo la interfaz no-genérica para representar una estructura de datos como diccionario: IDictionary. Aprenderemos que el tipo de dato para los elementos del diccionario es DictionaryEntry. Se resaltarán las diferencias respecto a su contraparte genérica IDictionary<TKey, TValue>.

2. Palabras Clave

  • Colección
  • Diccionario
  • Estructura de datos
  • No-genérico

3. La Interfaz IDictionary

3.1 Generalidades

Esta interfaz está diseñada para representar una colección que almacene o guarde sus elementos como un diccionario: cada elemento se distingue con una llave (o ID) y una valor asociado a esa llave; la recuperación se lleva a cabo por esa misma llave.

Implementa las interfaces ICollection y IEnumerable para que adquirir el comportamiento y estado de una colección y permitir la enumeración de los elementos.

En relación con lo anterior, los elementos de la colección son de tipo DictionaryEntry. Esta es una estructura que define una llave y un valor. Como consecuencia al recuperar un elemento de la colección IDictionary lo que se obtiene es un objeto de esta estructura, en lugar de un elemento del tipo de dato de la llave o el valor ("DictionaryEntry Structure", 207).

3.2 Propiedades y métodos sobresalientes

Entre las propiedades sobresalientes de esta interfaz se hallan:
  • Count: Obtiene la cantidad de elementos en la colección.
  • Keys: Obtiene todas las llaves.
  • Values: Obtiene todos los valores.
En cuanto a los métodos se pueden mencionar:
  • Add: Agrega un elemento con una llave de tipo Object y un valor del mismo tipo de dato.
  • Contains(Object): Comprueba si el diccionario contiene un objeto a partir de su llave.

3.3 Diferencias frente la versión genérica

Además de la carencia de genericidad, IDictionary se diferencia funcionalmente de su contraparte genérica IDictionary<TKey, TValue> (Diccionarios en C# - Parte 1/6: IDictionary(TKey, TValue)) en los siguientes aspectos (Albahari, 2012):
  • Al intentar recuperar un elemento inexistente por su llave se retorna null en lugar de generarse una excepción.
  • El método Contains comprueba la existencia por llave, mientras que ContainsKey de IDictionary<TKey, TValue> realiza lo mismo.

4. Conclusiones

Conocimos de forma breve la versión no-genérica de IDictionary. La interfaz para colecciones que no requieren la distinción de los tipos de datos para llave y valor. Se expusieron las diferencias fundamentales frente la versión genérica IDictionary<TKey, TValue>.

En el siguiente artículo hablaremos más acerca de IDictionary<TKey, TValue> y aprenderemos acerca de Hashtable.

5. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
IDictionary Interface (System.Collections) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.collections.idictionary%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
DictionaryEntry Structure (System.Collections) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.collections.dictionaryentry(v=vs.110).aspx
Diccionarios en C# - Parte 1/6: IDictionary(TKey, TValue) (2017). Recuperado desde: https://ortizol.blogspot.com.co/2017/11/diccionarios-en-csharp-parte-1-6-idictionary-tkey-tvalue-.html


O

domingo, 19 de noviembre de 2017

Diccionarios en C# - Parte 1/6: IDictionary(TKey, TValue)

Índice

1. Introducción
2. Palabras Clave
3. La Interfaz IDictionary<TKey, TValue>
4. Ejemplo de Uso
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

Entramos al estudio de los diccionarios: una estructura de datos o colección donde los elementos se representan con dos partes: una llave y un valor. Facilita la búsqueda, y es apropiada para listas ordenadas. En esta serie comprenderemos las interfaces que provee .NET para los diccionarios: IDictionary y IDictionary(TKey, TValue). También se incluye la descripción de implementaciones: OrderedDictionary, HybridDictionary y ListDictionary.


Este primer artículo describe la interfaz IDictionary(TKey, TValue), la cual constituye la interfaz para colecciones genéricas basadas en una llave y un valor.

2. Palabras Clave

  • Diccionario
  • Estructura de Datos
  • Llave
  • Valor

3. Diccionario


En el mundo de las colecciones o estructuras de datos un diccionario dispone los elementos por una llave y un valor asociado a esa llave. Para acceder a un elemento basta con especificar su llave; luego, la llave se puede ver como la palabra en un diccionario enciclopédico y su valor como su definición.
Analogía con diccionario enciclopédico
Figura 1. Analogía con diccionario enciclopédico ("Imagen diccionario", 2017).

Entre las características distintivas de esta estructura se hallan (Albahari, 2012)
  • Los datos o contenido de un elemento se acceden a través de un valor único.
  • El acceso tiene un complejidad O(1).
  • Una de la llave es través de un algoritmo de hash.
  • La estructura se análoga a un mapa: dado un nombre se accede a la locación concreta donde se haya el elemento.
  • Es posible tener como llave un valor null.
  • Se puede especificar un enumerador pero sin la promesa que el contenido esté ordenado.
En C# existen diferentes implementaciones de diccionario: la primera que se va a estudiar es IDictionary<TKey, TValue>.

3. La Interfaz IDictionary<TKey, TValue>

Esta interfaz representa un diccionario con llave y valor genéricos: TKey, TValue. En la firma de encabezado de esta interfaz se aprecia que implementa la interfaz genérica ICollection<KeyValuePair<TKey, TValue>>; y así mismo la adaptación a estructura enumerable con IEnumerable<KeyValuePair<TKey, TValue>>.

Entre sus propiedades genéricas se hallan ("IDictionary", 2017)
  • Count: Obtiene el número de elementos en el diccionario; i.e., la cantidad de llaves.
  • Keys: Llaves del diccionario.
  • Values: Valores del diccionario.
Y así mismo, estos métodos ("IDictionary", 2017):
  • Add(T): Agrega un elemento al diccionario.
  • Add(TKey, TValue): Agrega un elemento a partir de una llave y un valor.
  • Contains(T): Comprueba si un elemento existe en la colección.
  • Remove(T): Remueve la primera ocurrencia.
  • Remove(TKey): Remueve un elemento a través de su llave.
Para el método Add vale apuntar que si se intenta agregar un elemento con la misma llave, la excepción ArgumentException (Excepciones en C# - Parte 5: Ejemplos de Excepciones Comunes) es lanzada.

Para la enumeración de los elementos se provee el método GetEnumerator. Este método retorna una secuencia de objetos KeyValuePair: representa la llave y el valor de cada uno de los elementos que contiene el diccionario.

4. Ejemplo de Uso

Veamos el siguiente ejemplo de uso básico:

En la línea 10 se crea una instancia de la implementación concreta de IDictionary<TKey, TValue>. Esta instancia representa la asociación de extensiones de tipos de archivos con el programa manejador para apertura: en las líneas 13-16 se agregan los elementos, y luego, en las líneas 18-22 se itera el diccionario: notemos aquí que cada elemento se presenta con un objeto KeyValuePair<string, string>.

5. Conclusiones

Describimos la interfaz IDictionary<TKey, TValue>: representación general o abstracta de una estructura de datos basada en diccionario: cada elemento se presenta por dos ítems: una llave y un valor. Su analogía principal es la de Dictionary<TKey, TValue>.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.

Imagen diccionario (2017). Recuperado desde: https://androidayuda.com/app/uploads/2015/02/diccionario-2.jpg
IDictionary(TKey, TValue) Interface (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/s4ys34ea(v=vs.110).aspx
Excepciones en C# - Parte 5: Ejemplos de Excepciones Comunes (2017). Recuperado desde: https://ortizol.blogspot.com.co/2014/07/excepciones-en-csharp-parte-5-ejemplos-de-excepciones-comunes.html


O