// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using System.Dynamic;
namespace Admin.NET.Core;
///
/// 字典扩展方法
///
public static class DictionaryExtensions
{
///
/// 使用给定的键从字典中获取值。如果找不到,则返回默认值
///
/// 键的类型
/// 值的类型
/// 要检查和获取的字典
/// 要查找值的键
/// 如果找到,返回值;如果找不到,返回默认值
public static TValue? GetOrDefault(this Dictionary dictionary, TKey key) where TKey : notnull
{
return dictionary.GetValueOrDefault(key);
}
///
/// 使用给定的键从字典中获取值。如果找不到,则返回默认值
///
/// 键的类型
/// 值的类型
/// 要检查和获取的字典
/// 要查找值的键
/// 如果找到,返回值;如果找不到,返回默认值
public static TValue? GetOrDefault(this IDictionary dictionary, TKey key)
{
return dictionary.TryGetValue(key, out var obj) ? obj : default;
}
///
/// 使用给定的键从只读字典中获取值。如果找不到,则返回默认值
///
/// 键的类型
/// 值的类型
/// 要检查和获取的只读字典
/// 要查找值的键
/// 如果找到,返回值;如果找不到,返回默认值
public static TValue? GetOrDefault(this IReadOnlyDictionary dictionary, TKey key)
{
return dictionary.GetValueOrDefault(key);
}
///
/// 使用给定的键从并发字典中获取值。如果找不到,则返回默认值
///
/// 键的类型,不能为空
/// 值的类型
/// 要检查和获取的并发字典
/// 要查找值的键
/// 如果找到,返回值;如果找不到,返回默认值
public static TValue? GetOrDefault(this ConcurrentDictionary dictionary, TKey key) where TKey : notnull
{
return dictionary.GetValueOrDefault(key);
}
///
/// 使用给定的键从字典中获取值。如果找不到,则使用工厂方法创建并添加值
///
/// 键的类型
/// 值的类型
/// 要检查和获取的字典
/// 要查找值的键
/// 如果字典中未找到,则用于创建值的工厂方法
/// 如果找到,返回值;如果找不到,使用工厂方法创建并返回默认值
public static TValue GetOrAdd(this IDictionary dictionary, TKey key, Func factory)
{
return dictionary.TryGetValue(key, out var obj) ? obj : dictionary[key] = factory(key);
}
///
/// 使用给定的键从字典中获取值。如果找不到,则使用工厂方法创建并添加值
///
/// 键的类型
/// 值的类型
/// 要检查和获取的字典
/// 要查找值的键
/// 如果字典中未找到,则用于创建值的工厂方法
/// 如果找到,返回值;如果找不到,使用工厂方法创建并返回默认值
public static TValue GetOrAdd(this IDictionary dictionary, TKey key, Func factory)
{
return dictionary.GetOrAdd(key, _ => factory());
}
///
/// 使用给定的键从并发字典中获取值。如果找不到,则使用工厂方法创建并添加值
///
/// 键的类型,不能为空
/// 值的类型
/// 要检查和获取的并发字典
/// 要查找值的键
/// 如果并发字典中未找到,则用于创建值的工厂方法
/// 如果找到,返回值;如果找不到,使用工厂方法创建并返回默认值
public static TValue GetOrAdd(this ConcurrentDictionary dictionary, TKey key, Func factory) where TKey : notnull
{
return dictionary.GetOrAdd(key, _ => factory());
}
///
/// 将字典转换为动态对象,以便在运行时添加和移除
///
/// 要转换的字典对象
/// 如果值正确,返回表示对象的 ExpandoObject
public static dynamic ConvertToDynamicObject(this Dictionary dictionary)
{
ExpandoObject expandoObject = new();
ICollection> expendObjectCollection = expandoObject!;
foreach (var keyValuePair in dictionary)
{
expendObjectCollection.Add(keyValuePair);
}
return expandoObject;
}
///
/// 如果字典中存在指定的键,则尝试获取其值
///
/// 值的类型
/// 字典对象
/// 要查找的键
/// 键对应的值,如果键不存在,则为默认值
/// 如果字典中存在该键,则返回真(True);否则返回假(False)
public static bool TryGetValue(this IDictionary dictionary, string key, out T? value)
{
if (dictionary.TryGetValue(key, out var valueObj) && valueObj is T t)
{
value = t;
return true;
}
value = default;
return false;
}
///
/// 字典根据 key 删除,返回一个新的字典
///
///
///
/// 移除后新的字典
public static IDictionary RemoveByKeys(this IDictionary dictionary, params string[] keys)
{
ArgumentNullException.ThrowIfNull(dictionary);
if (keys.Length == 0)
{
return dictionary;
}
// 创建一个新的字典,避免修改原始字典
var newDic = new Dictionary(dictionary);
foreach (var key in keys)
{
newDic.Remove(key);
}
return newDic;
}
}