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:
Post a Comment