/// <summary>
        /// return old value and set to new value.
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <typeparam name="TValue"></typeparam>
        /// <param name="dict"></param>
        /// <param name="key"></param>
        /// <param name="newValue"></param>
        /// <param name="defaultReturnValue"></param>
        /// <returns></returns>
        public static TValue GetAndSetValue <TKey, TValue>(this IDictionary <TKey, TValue> dict, TKey key,
                                                           TValue newValue, TValue defaultReturnValue = default(TValue))
        {
            if (dict == null)
            {
                throw new ArgumentNullException(nameof(dict));
            }

            try
            {
                return(dict.GetValueOrDefault(key, defaultReturnValue));
            }
            finally
            {
                dict[key] = newValue;
            }
        }
 public static TValue GetValueOrDefault <TKey, TValue>(this IDictionary <TKey, TValue> dictionary, TKey key)
 {
     return(dictionary.GetValueOrDefault(key, default(TValue)));
 }