using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; namespace Masuit.Tools.Systems; /// /// 支持null-key和value的字典类型 /// /// /// public class NullableDictionary : Dictionary, TValue> { public NullableDictionary() { } public NullableDictionary(TValue fallbackValue) { FallbackValue = fallbackValue; } public NullableDictionary(int capacity) : base(capacity) { } public NullableDictionary(IEqualityComparer> comparer) : base(comparer) { } public NullableDictionary(int capacity, IEqualityComparer> comparer) : base(capacity, comparer) { } public NullableDictionary(IDictionary, TValue> dictionary) : base(dictionary) { } public NullableDictionary(IDictionary, TValue> dictionary, IEqualityComparer> comparer) : base(dictionary, comparer) { } internal TValue FallbackValue { get; set; } /// /// /// /// public new TValue this[NullObject key] { get => TryGetValue(key, out var value) ? value : FallbackValue; set => base[key] = value; } public virtual TValue this[Func, bool> condition] { get { foreach (var pair in this.Where(pair => condition(new KeyValuePair(pair.Key.Item, pair.Value)))) { return pair.Value; } return FallbackValue; } set { foreach (var pair in this.Where(pair => condition(new KeyValuePair(pair.Key.Item, pair.Value)))) { this[pair.Key] = value; } } } public virtual TValue this[Func condition] { get { foreach (var pair in this.Where(pair => condition(pair.Key.Item, pair.Value))) { return pair.Value; } return FallbackValue; } set { foreach (var pair in this.Where(pair => condition(pair.Key.Item, pair.Value))) { this[pair.Key] = value; } } } public virtual TValue this[Func condition] { get { foreach (var pair in this.Where(pair => condition(pair.Key.Item))) { return pair.Value; } return FallbackValue; } set { foreach (var pair in this.Where(pair => condition(pair.Key.Item))) { this[pair.Key] = value; } } } public virtual TValue this[Func condition] { get { foreach (var pair in this.Where(pair => condition(pair.Value))) { return pair.Value; } return FallbackValue; } set { foreach (var pair in this.Where(pair => condition(pair.Value))) { this[pair.Key] = value; } } } /// /// /// /// public virtual TValue this[TKey key] { get => TryGetValue(new NullObject(key), out var value) ? value : FallbackValue; set => base[new NullObject(key)] = value; } public bool ContainsKey(TKey key) { return base.ContainsKey(new NullObject(key)); } public void Add(TKey key, TValue value) { base.Add(new NullObject(key), value); } public bool Remove(TKey key) { return base.Remove(new NullObject(key)); } public bool TryGetValue(TKey key, out TValue value) { return base.TryGetValue(new NullObject(key), out value); } /// /// 隐式转换 /// /// public static implicit operator NullableDictionary(Dictionary dic) { var nullableDictionary = new NullableDictionary(); foreach (var p in dic) { nullableDictionary[p.Key] = p.Value; } return nullableDictionary; } /// /// 隐式转换 /// /// public static implicit operator NullableDictionary(ConcurrentDictionary dic) { var nullableDictionary = new NullableDictionary(); foreach (var p in dic) { nullableDictionary[p.Key] = p.Value; } return nullableDictionary; } /// /// 隐式转换 /// /// public static implicit operator Dictionary(NullableDictionary dic) { var newdic = new Dictionary(); foreach (var p in dic) { newdic[p.Key] = p.Value; } return newdic; } }