using System; using System.Collections.Generic; using System.Linq; namespace Developpez.Dotnet.Collections { /// /// Fournit des méthodes d'extension pour manipuler des dictionnaires /// public static class DictionaryExtensions { /// /// Renvoie la valeur correspondant à la clé spécifiée si celle-ci est présente dans le dictionnaire, /// ou la valeur par défaut spécifiée si la clé est absente. /// /// Type de la clé /// Type de la valeur /// Le dictionnaire à partir duquel renvoyer la valeur /// La clé recherchée /// La valeur par défaut à renvoyer si la clé est absente du dictionnaire /// Si la clé est présente, renvoie la valeur correspondante. Sinon, renvoie la valeur par défaut public static TValue GetValueOrDefault(this IDictionary dictionary, TKey key, TValue defaultValue) { TValue value; if (!dictionary.TryGetValue(key, out value)) value = defaultValue; return value; } /// /// Renvoie la valeur correspondant à la clé spécifiée si celle-ci est présente dans le dictionnaire, /// ou la valeur par défaut du type de la valeur si la clé est absente. /// /// Type de la clé /// Type de la valeur /// Le dictionnaire à partir duquel renvoyer la valeur /// La clé recherchée /// Si la clé est présente, renvoie la valeur correspondante. Sinon, renvoie la valeur par défaut public static TValue GetValueOrDefault(this IDictionary dictionary, TKey key) { return dictionary.GetValueOrDefault(key, default(TValue)); } /// /// Renvoie la valeur correspondant à la clé spécifiée si celle-ci est présente dans le dictionnaire. /// Sinon, utilise la fonction fournie pour générer la valeur, l'ajoute au dictionnaire, et renvoie cette valeur. /// /// Type de la clé /// Type de la valeur /// Le dictionnaire à partir duquel renvoyer la valeur /// La clé recherchée /// La fonction utilisée pour générer la valeur si la clé est absente. /// La valeur correspondant à la clé. Si la clé demandée n'existe pas dans le dictionnaire, la valeur est générée par la fonction fournie et ajoutée au dictionnaire avant d'être renvoyée. public static TValue GetOrAdd(this IDictionary dictionary, TKey key, Func valueFactory) { return dictionary.GetOrCreate(key, valueFactory, true); } /// /// Renvoie la valeur correspondant à la clé spécifiée si celle-ci est présente dans le dictionnaire. /// Sinon, utilise la fonction fournie pour générer la valeur et renvoie cette valeur. La valeur générée /// n'est pas ajoutée au dictionnaire. /// /// Type de la clé /// Type de la valeur /// Le dictionnaire à partir duquel renvoyer la valeur /// La clé recherchée /// La fonction utilisée pour générer la valeur si la clé est absente. /// La valeur correspondant à la clé. Si la clé demandée n'existe pas dans le dictionnaire, la valeur est générée par la fonction fournie. public static TValue GetOrCreate(this IDictionary dictionary, TKey key, Func valueFactory) { return dictionary.GetOrCreate(key, valueFactory, false); } private static TValue GetOrCreate(this IDictionary dictionary, TKey key, Func valueFactory, bool addIfMissing) { TValue value; if (!dictionary.TryGetValue(key, out value)) { value = valueFactory(key); if (addIfMissing) dictionary[key] = value; } return value; } /// /// Renvoie un wrapper en lecture seule pour un dictionnaire /// /// Type de la clé /// Type de la valeur /// Le dictionnaire pour lequel renvoyer un wrapper /// Un wrapper en lecture seule du dictionnaire public static ReadOnlyDictionary AsReadOnly(this IDictionary dictionary) { return new ReadOnlyDictionary(dictionary); } /// /// Renvoie un wrapper ou une copie en lecture seule pour un dictionnaire /// /// Type de la clé /// Type de la valeur /// Le dictionnaire pour lequel renvoyer un wrapper /// true pour renvoyer une copie en lecture seule du dictionnaire ; false pour renvoyer simplement un wrapper du dictionnaire existant /// Un wrapper ou une copie en lecture seule du dictionnaire public static ReadOnlyDictionary AsReadOnly(this IDictionary dictionary, bool copy) { return new ReadOnlyDictionary(dictionary, copy); } /// /// Reconstruit un dictionnaire à partir d'une séquence de paires clé/valeur /// /// Type de la clé /// Type de la valeur /// Séquence de paires clé/valeur /// Un dictionnaire qui contient les paires clé/valeur de la séquence d'origine public static IDictionary ToDictionary(this IEnumerable> source) { return source.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); } } }