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