Files
Common-VS2019/SacsStandardBase/Base/Utils/DictionaryUtil.cs
T

114 lines
4.6 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
namespace Sarand.Net.Standard.Base.Utils
{
//=======================================================================
public static class DictionaryUtil
{
//-------------------------------------------------------------------
// C o n t a i n s K e y s
//-------------------------------------------------------------------
public static bool ContainsKeys<TKey, TValue>(this Dictionary<TKey, TValue> dict, IEnumerable<TKey> keys)
{
bool result = false;
keys.ForEachOrBreak((x) => { result = dict.ContainsKey(x); return result; });
return result;
}
//-------------------------------------------------------------------
// G e n e r i c G e t W i t h D e f a u l t
//-------------------------------------------------------------------
/// <summary>Safely get value from Dictionary with default if not defined.</summary>
public static TValue GetValue<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue)
{
return GetValue(dictionary as IDictionary<TKey, TValue>, key, defaultValue);
}
/// <summary>Safely get value from Dictionary with default if not defined.</summary>
public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue)
{
if (key == null) return defaultValue;
TValue value;
return dictionary.TryGetValue(key, out value) ? value : defaultValue;
}
//-------------------------------------------------------------------
// G e t V a l u e s
//-------------------------------------------------------------------
public static List<TValue> GetValues<TKey, TValue>(this Dictionary<TKey, TValue> dict)
{
return dict.Select(item => item.Value).ToList();
}
//-------------------------------------------------------------------
// S t r i n g - I n t U t i l i t i e s
//-------------------------------------------------------------------
/// <summary>Increment the count against the specified key by the supplied value, creating the key's entry if needed.</summary>
public static void Increment(this IDictionary<String, int> dictionary, String key, int increment = 1)
{
if (!dictionary.ContainsKey(key))
dictionary[key] = increment;
else
dictionary[key] += increment;
}
//-------------------------------------------------------------------
// A d d T o L i s t V a l u e
//-------------------------------------------------------------------
/// <summary>Add key:object to dictionary where each value is a list of objects.</summary>
public static void Add<TKey, TValue>(this Dictionary<TKey, List<TValue>> dict, TKey key, TValue value)
{
if (!dict.ContainsKey(key))
dict[key] = new List<TValue>();
dict[key].Add(value);
}
/// <summary>Add key:objects to dictionary where each value is a list of objects.</summary>
public static void Add<TKey, TValue>(this Dictionary<TKey, List<TValue>> dict, TKey key, IEnumerable<TValue> values)
{
if (!dict.ContainsKey(key))
dict[key] = new List<TValue>();
dict[key].AddRange(values);
}
//-------------------------------------------------------------------
// A d d R a n g e
//-------------------------------------------------------------------
/// <summary>Add entries from another dictionary.</summary>
public static void AddRange<TKey, TValue>(this Dictionary<TKey, TValue> dict, Dictionary<TKey, TValue> dictToAdd)
{
dictToAdd.ForEach(x => dict.Add(x.Key, x.Value));
}
//-------------------------------------------------------------------
// Orderd Dictionary
//-------------------------------------------------------------------
public static DictionaryEntry GetElementAt(this OrderedDictionary dictionary, int index)
{
return dictionary.Cast<DictionaryEntry>().ElementAt(index);
}
public static K GetKeyAt<K>(this OrderedDictionary dictionary, int index)
{
return (K)dictionary.GetElementAt(index).Key;
}
public static V GetValue<K, V>(this OrderedDictionary dictionary, K key)
{
if (dictionary == null || key == null)
return default(V);
try
{
return (V)dictionary.Cast<DictionaryEntry>().AsQueryable().Single(kvp => ((K)kvp.Key).Equals(key)).Value;
}
catch (Exception)
{
return default(V);
}
}
//-------------------------------------------------------------------
}
//=======================================================================
}