c# - ltr - "GetOrCreate": ¿ese idioma tiene un nombre establecido?
idioma pagina web (5)
Cía#...
... Tengo un DefaultingDictionary <> que hace esto. Como un bono
- puede especificar un valor predeterminado o una función de fábrica para crear valores para las claves que faltan:
- viene con conversión implícita de IDictionary <> (envolviendo el diccionario)
- viene con métodos de extensión para transformar cualquier diccionario en un DefaultingDictionary <> al vuelo
Código Completo:
Las extensiones .AsDefaulting
se pueden usar para usar cualquier IDictionary<>
transparente, por lo que puede optar por usar cualquier diccionario (incluso, por ejemplo, obtenido de una API de terceros) como predeterminado, y el contenedor subyacente se actualizará con cualquier Artículos ''auto-vivificados''.
Utilízalo como
IDictionary<string, MyItem> dict = LoadFromDatabase();
// using a fixed value
SomeFunc(dict.AsDefaulting(defaultItem));
// using an independent generator function
var defaulting = dict.AsDefaulting(() => new MyItem { Id = System.Guid.NewGuid() });
// using a keydepedent generator function
var defaulting = dict.AsDefaulting(key => LazyLoadFromDatabase(key));
Algunos casos de prueba
están incluidos:
Ok, considera este lenguaje común que la mayoría de nosotros hemos usado muchas veces (supongo):
class FooBarDictionary
{
private Dictionary<String, FooBar> fooBars;
...
FooBar GetOrCreate(String key)
{
FooBar fooBar;
if (!fooBars.TryGetValue(key, out fooBar))
{
fooBar = new FooBar();
fooBars.Add(key, fooBar);
}
return fooBar;
}
}
¿Tiene algún tipo de nombre establecido?
(Sí, está escrito en C #, pero puede transferirse "fácilmente" a C ++. De ahí esa etiqueta).
Carga lenta
Depende de la razón por la que lo esté haciendo: el lenguaje es uno que he visto que se llama memoización, almacenamiento en caché, inicialización bajo demanda, creación en el primer uso. Normalmente llamo el método "asegurarFoo" en lugar de "GetOrCreate"
No estoy seguro del nombre de programación general para el patrón de alto nivel, pero Perl tiene este maravilloso comportamiento llamado Autovivification , es decir, la creación automática de una clave de hash (mapa) con un valor no definido cuando se consulta el valor de una clave no existente en el hash .
Siempre llamo a tales funciones obtener obtainSomething()
.