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; } } }