using System; using System.Collections.Generic; namespace Swan { /// /// Extension methods. /// public static partial class Extensions { /// /// Gets the value if exists or default. /// /// The type of the key. /// The type of the value. /// The dictionary. /// The key. /// The default value. /// /// The value of the provided key or default. /// /// dict. public static TValue GetValueOrDefault(this IDictionary dict, TKey key, TValue defaultValue = default) { if (dict == null) throw new ArgumentNullException(nameof(dict)); return dict.ContainsKey(key) ? dict[key] : defaultValue; } /// /// Adds a key/value pair to the Dictionary if the key does not already exist. /// If the value is null, the key will not be updated. /// Based on ConcurrentDictionary.GetOrAdd method. /// /// The type of the key. /// The type of the value. /// The dictionary. /// The key. /// The value factory. /// /// The value for the key. /// /// /// dict /// or /// valueFactory. /// public static TValue GetOrAdd(this IDictionary dict, TKey key, Func valueFactory) { if (dict == null) throw new ArgumentNullException(nameof(dict)); if (valueFactory == null) throw new ArgumentNullException(nameof(valueFactory)); if (!dict.ContainsKey(key)) { var value = valueFactory(key); if (Equals(value, default)) return default; dict[key] = value; } return dict[key]; } /// /// Executes the item action for each element in the Dictionary. /// /// The type of the key. /// The type of the value. /// The dictionary. /// The item action. /// dict. public static void ForEach(this IDictionary dict, Action itemAction) { if (dict == null) throw new ArgumentNullException(nameof(dict)); foreach (var kvp in dict) { itemAction(kvp.Key, kvp.Value); } } } }