using System; using System.Collections.Generic; namespace Developpez.Dotnet.Collections { /// /// Représente un dictionnaire dont toutes les clés sont supposées définies. Si la clé demandée /// n'existe pas dans le dictionnaire, une valeur par défaut est renvoyée. Cette valeur par défaut /// est automatiquement ajoutée au dictionnaire avec la clé associée, sauf indication contraire. /// /// Type de la clé /// Type de la valeur public class DefaultDictionary : DictionaryBase { private readonly bool _addMissingKeys; private readonly Func _defaultValueGenerator; /// /// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente, /// la valeur par défaut du type V est renvoyée. /// public DefaultDictionary() : this(k => default(TValue), true) { } /// /// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente, /// la valeur par défaut du type V est renvoyée. Si addMissingKeys vaut true, la valeur /// par défaut est ajoutée au dictionnaire avec la clé associée. /// /// true pour ajouter automatiquement au dictionnaire les clés manquantes et leur valeur associée ; sinon, false public DefaultDictionary(bool addMissingKeys) : this(k => default(TValue), addMissingKeys) { } /// /// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente, /// la valeur par défaut spécifiée est renvoyée. /// /// La valeur par défaut à utiliser pour les clés absentes public DefaultDictionary(TValue defaultValue) : this(k => defaultValue, true) { } /// /// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente, /// la valeur par défaut spécifiée est renvoyée. Si addMissingKeys vaut true, la valeur /// par défaut est ajoutée au dictionnaire avec la clé associée. /// /// La valeur par défaut à utiliser pour les clés absentes /// true pour ajouter automatiquement au dictionnaire les clés manquantes et leur valeur associée ; sinon, false public DefaultDictionary(TValue defaultValue, bool addMissingKeys) : this(k => defaultValue, addMissingKeys) { } /// /// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente, /// la valeur générée par le delegate fourni en paramètre est renvoyée. /// /// Une fonction qui renvoie une valeur initiale pour une clé absente public DefaultDictionary(Func defaultValueGenerator) : this(defaultValueGenerator, true) { } /// /// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente, /// la valeur générée par le delegate fourni en paramètre est renvoyée. Si addMissingKeys vaut true, la valeur /// par défaut est ajoutée au dictionnaire avec la clé associée. /// /// Une fonction qui renvoie une valeur initiale pour une clé absente /// true pour ajouter automatiquement au dictionnaire les clés manquantes et leur valeur associée ; sinon, false public DefaultDictionary(Func defaultValueGenerator, bool addMissingKeys) : base(new Dictionary()) { _defaultValueGenerator = defaultValueGenerator; _addMissingKeys = addMissingKeys; } /// /// Renvoie une valeur indiquant si ce dictionnaire ajoute automatiquement /// les clés manquantes et leur valeur associée lorsqu'elles sont demandées /// public bool AddMissingKeys { get { return _addMissingKeys; } } /// /// Obtient la valeur associée à la clé spécifiée. Si la clé n'existe pas, une valeur par défaut est renvoyée /// /// La clé pour laquelle retourner une valeur /// La valeur correspondant à la clé public override TValue this[TKey key] { get { TValue value; if (!base.TryGetValue(key, out value)) { value = _defaultValueGenerator(key); if (_addMissingKeys) this[key] = value; } return value; } set { base[key] = value; } } /// /// Obtient la valeur associée à la clé spécifiée. Si la clé n'existe pas, une valeur par défaut est renvoyée. /// /// La clé recherchée /// Paramètre de sortie auquel la valeur trouvée est affectée /// Toujours true public override bool TryGetValue(TKey key, out TValue value) { value = this[key]; return true; } } }