NullableDictionary.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System.Collections.Concurrent;
  2. using System.Collections.Generic;
  3. namespace Masuit.Tools.Systems;
  4. /// <summary>
  5. /// 支持null-key和value的字典类型
  6. /// </summary>
  7. /// <typeparam name="TKey"></typeparam>
  8. /// <typeparam name="TValue"></typeparam>
  9. public class NullableDictionary<TKey, TValue> : Dictionary<NullObject<TKey>, TValue>
  10. {
  11. public NullableDictionary() : base()
  12. {
  13. }
  14. public NullableDictionary(TValue fallbackValue) : base()
  15. {
  16. FallbackValue = fallbackValue;
  17. }
  18. public NullableDictionary(int capacity) : base(capacity)
  19. {
  20. }
  21. public NullableDictionary(IEqualityComparer<NullObject<TKey>>? comparer) : base(comparer)
  22. {
  23. }
  24. public NullableDictionary(int capacity, IEqualityComparer<NullObject<TKey>> comparer) : base(capacity, comparer)
  25. {
  26. }
  27. public NullableDictionary(IDictionary<NullObject<TKey>, TValue> dictionary) : base(dictionary)
  28. {
  29. }
  30. public NullableDictionary(IDictionary<NullObject<TKey>, TValue> dictionary, IEqualityComparer<NullObject<TKey>> comparer) : base(dictionary, comparer)
  31. {
  32. }
  33. internal TValue FallbackValue { get; set; }
  34. /// <summary>
  35. ///
  36. /// </summary>
  37. /// <param name="key"></param>
  38. public new TValue this[NullObject<TKey> key]
  39. {
  40. get => TryGetValue(key, out var value) ? value : FallbackValue;
  41. set => base[key] = value;
  42. }
  43. ///// <summary>
  44. /////
  45. ///// </summary>
  46. ///// <param name="key"></param>
  47. //public virtual TValue this[TKey key]
  48. //{
  49. // get => TryGetValue(key, out var value) ? value : FallbackValue;
  50. // set => base[key] = value;
  51. //}
  52. /// <summary>
  53. /// 隐式转换
  54. /// </summary>
  55. /// <param name="dic"></param>
  56. public static implicit operator NullableDictionary<TKey, TValue>(Dictionary<TKey, TValue> dic)
  57. {
  58. var nullableDictionary = new NullableDictionary<TKey, TValue>();
  59. foreach (var p in dic)
  60. {
  61. nullableDictionary[p.Key] = p.Value;
  62. }
  63. return nullableDictionary;
  64. }
  65. /// <summary>
  66. /// 隐式转换
  67. /// </summary>
  68. /// <param name="dic"></param>
  69. public static implicit operator NullableDictionary<TKey, TValue>(ConcurrentDictionary<TKey, TValue> dic)
  70. {
  71. var nullableDictionary = new NullableDictionary<TKey, TValue>();
  72. foreach (var p in dic)
  73. {
  74. nullableDictionary[p.Key] = p.Value;
  75. }
  76. return nullableDictionary;
  77. }
  78. /// <summary>
  79. /// 隐式转换
  80. /// </summary>
  81. /// <param name="dic"></param>
  82. public static implicit operator Dictionary<TKey, TValue>(NullableDictionary<TKey, TValue> dic)
  83. {
  84. var newdic = new Dictionary<TKey, TValue>();
  85. foreach (var p in dic)
  86. {
  87. newdic[p.Key] = p.Value;
  88. }
  89. return newdic;
  90. }
  91. }