using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Developpez.Dotnet.Collections
{
///
/// Représente un dictionnaire dont toutes les clés sont supposées définies. Si une clé demandée
/// n'existe pas dans le dictionnaire, elle est automatiquement créée avec la valeur par défaut ou
/// le delegate spécifié
///
/// Type de la clé
/// Type de la valeur
public class DefaultDictionary : DictionaryBase
{
private Func _defaultValueGenerator;
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si une clé demandée est absente,
/// elle est ajoutée avec la valeur par défaut du type de valeur du dictionnaire.
///
public DefaultDictionary()
: this(k => default(V))
{
}
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si une clé demandée est absente,
/// elle est ajoutée avec la valeur par défaut spécifiée.
///
/// La valeur par défaut à utiliser pour les clés absentes
public DefaultDictionary(V defaultValue)
: this(k => defaultValue)
{
}
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si une clé demandée est absente,
/// elle est ajoutée avec la valeur renvoyée par le delegate fourni en paramètre.
///
/// Une fonction qui renvoie une valeur initiale pour une clé absente
public DefaultDictionary(Func defaultValueGenerator)
: base(new Dictionary())
{
_defaultValueGenerator = defaultValueGenerator;
}
///
/// Obtient la valeur associée à la clé spécifiée. Si la clé n'existe pas, elle est ajoutée au
/// dictionnaire avec une valeur par défaut.
///
/// La clé pour laquelle retourner une valeur
/// La valeur correspondant à la clé
public override V this[K key]
{
get
{
V value;
if (!base.TryGetValue(key, out value))
{
value = _defaultValueGenerator(key);
base[key] = value;
}
return value;
}
set
{
base[key] = value;
}
}
///
/// Obtient la valeur associée à la clé spécifiée. Si la clé n'existe pas, elle est ajoutée au
/// dictionnaire avec une valeur par défaut.
///
/// La clé recherchée
/// Paramètre de sortie auquel la valeur trouvée est affectée
/// Toujours true
public override bool TryGetValue(K key, out V value)
{
value = this[key];
return true;
}
}
}