DictionaryExtensions : Excelente extensión de IDictionary

Gracias a José F. Romaniello les paso está excelente extensión de IDictionary, el cual nos permite recuperar un valor del diccionario a partir de una key y en el caso de que esta no exista en el diccionario, creará la entrada y luego retornará el valor:

public static class DictionaryExtensions
{
    public static TValue GetOrAdd(
        this IDictionary dictionary, TKey key, Func create)
    {
        TValue result;
        if (!dictionary.TryGetValue(key, out result))
        {
            result = create();
            dictionary[key] = result;
        }
        return result;
    }
}

Veamos un ejemplo muy simple de como usar esta extensión. Previamente creamos un diccionario con la clave del tipo int y el valor del tipo string y además le agregaremos cuatro entradas:

    IDictionary usuarios = new Dictionary();

    usuarios.Add(1, "Sebis");
    usuarios.Add(2, "Silvi");
    usuarios.Add(3, "Rafa");
    usuarios.Add(5, "Jose");

Finalmente crearemos un delegado encargado de devolver el valor que queremos agregar al diccionario en caso de que no exista una entrada con la key que especificaremos al llamar a nuestro método de extensión.

En el siguiente ejemplo veremos dos casos, el primero retorna el valor de una entrada que ya existe en el diccionario, y en el segundo retorna el valor de una nueva entrada que agregaremos en el diccionario:

    Func create = delegate() { return "Fernando"; };

    // En este caso como ya existe una entrada en el diccionario con la key 1 nos retornará su valor : "Sebis"
    string usuarioExistente = DictionaryExtensions.GetOrAdd(usuarios, 1, create);
    // En este caso como no existe una entrada en el diccionario con la key 4 nos creará y retornará el nuevo valor : "Fernando"
    string usuarioNuevo = DictionaryExtensions.GetOrAdd(usuarios, 4, create);

Espero que les sea de utilidad!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s