Tuesday, August 22, 2006

tipos genericos multidimensionales en C#

Uno puede explicar los tipos Genericos como arreglos en asteroides, o collecciones en asteroides o una combinacion de los dos, los tipos genericos nos ofrecen una lista expandible de elementos type-safe (tipos de datos seguros?); o como lo describe MSDN:

Genericos te permiten definir estructuras de datos type-safe, sin que estas sean especificas a tipos de datos actuales.

Una cosa que no he visto mucho es como se pueden usar genericos multidimensionales (asi es, yo me invente el termino J), permitanme explicarles a que me refiero.

Vamos a decir que queremos guardar una lista de nombres de archivo, podriamos usar algo asi::



List<string> listaDeArchivos = CargarListaArchivos();
ListarArchivos(listaDeArchivos);

Ahora necesitamos una lista de directorios con los archivos que contienen, entonces podemos usar un tipo generico bidimensional que contenga el nombre del directorio en la llave de un diccionario y la lista de archivos en el valor del diccionario:

Dictionary<string, List<string>> directoriosConArchivos =
CargarDirectoriosConArchivos();
foreach (KeyValuePair<string, List<string>> kv in directoriosConArchivos) {
Console.WriteLine(string.Format(" Folder: [{0}]", kv.Key));
ListarArchivos(kv.Value);
}

finalmente, digamos que queremos una lista de computadoras, con los directorios y los archivos que estos contienen; para esto podemos usar un tipo generico multidimensional que tenga el nombre de la computadora en la llave de un diccionario y los folders con archivos en el valor de este diccionario (ya se complica el asunto)

Dictionary<string, Dictionary<string, List<string>>> archivosEnComputadoras =
CargarListaDeArchivosEnComputadoras();
foreach (KeyValuePair<string, Dictionary<string, List<string>>> kv in archivosEnComputadoras ) {
Console.WriteLine(string.Format("Computadora: [{0}]", kv.Key));
foreach (KeyValuePair<string, List<string>> kv1 in kv.Value) {
Console.WriteLine(string.Format(" Folder: [{0}]", kv1.Key));
ListarArchivos(kv1.Value);
}
}

Solo como algo adicional, aqui les dejo la funcion ListarArchivos, que muestra un uso interesante de los genericos combinado con delegados anonimos

static void ListFiles(List<string> filesList) {
filesList.ForEach(new Action<string>(delegate(string s) {
Console.WriteLine(string.Format(" {0}", s)); }));
}

Como pueden ver, con los tipos genericos se pueden crear estructuras de datos muy complejas que mantienen el type-safe (como se dice esto!!!), peeeeeero... como siempre, siempre habra quien se queje de que los tipos genericos multidimensionales se tornan muy cripticos (yo soy el primero en quejarme);
Esto se puede ilustrar simplemente escribiendo algo asi:


Dictionary<string, Dictionary<string, List<string>>> archivosEnComputadoras =
new Dictionary<string, Dictionary<string, List<string>>>();

En mi siguiente post, les mostrare un par de tecnicas de como podemos esconder toda esta complejidad y aun asi mantener los beneficios de los tipos genericos

salu2

No comments: