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