NullableConcurrentDictionary.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 NullableConcurrentDictionary<TKey, TValue> : ConcurrentDictionary<NullObject<TKey>, TValue>
  10. {
  11. public NullableConcurrentDictionary() : base()
  12. {
  13. }
  14. public NullableConcurrentDictionary(int concurrencyLevel, int capacity) : base(concurrencyLevel, capacity)
  15. {
  16. }
  17. public NullableConcurrentDictionary(IEqualityComparer<NullObject<TKey>> comparer) : base(comparer)
  18. {
  19. }
  20. public new TValue this[NullObject<TKey> key]
  21. {
  22. get => TryGetValue(key, out var value) ? value : default;
  23. set => base[key] = value;
  24. }
  25. /// <summary>
  26. /// 隐式转换
  27. /// </summary>
  28. /// <param name="dic"></param>
  29. public static implicit operator NullableConcurrentDictionary<TKey, TValue>(Dictionary<TKey, TValue> dic)
  30. {
  31. var nullableDictionary = new NullableConcurrentDictionary<TKey, TValue>();
  32. foreach (var p in dic)
  33. {
  34. nullableDictionary[p.Key] = p.Value;
  35. }
  36. return nullableDictionary;
  37. }
  38. /// <summary>
  39. /// 隐式转换
  40. /// </summary>
  41. /// <param name="dic"></param>
  42. public static implicit operator NullableConcurrentDictionary<TKey, TValue>(ConcurrentDictionary<TKey, TValue> dic)
  43. {
  44. var nullableDictionary = new NullableConcurrentDictionary<TKey, TValue>();
  45. foreach (var p in dic)
  46. {
  47. nullableDictionary[p.Key] = p.Value;
  48. }
  49. return nullableDictionary;
  50. }
  51. /// <summary>
  52. /// 隐式转换
  53. /// </summary>
  54. /// <param name="dic"></param>
  55. public static implicit operator ConcurrentDictionary<TKey, TValue>(NullableConcurrentDictionary<TKey, TValue> dic)
  56. {
  57. var newdic = new ConcurrentDictionary<TKey, TValue>();
  58. foreach (var p in dic)
  59. {
  60. newdic[p.Key] = p.Value;
  61. }
  62. return newdic;
  63. }
  64. }