/Main/src/DynamicDataDisplay.Maps/Set.cs

# · C# · 85 lines · 65 code · 16 blank · 4 comment · 2 complexity · e82c4c63acaad7814e41bf869d26ca33 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Collections;
  6. using System.Diagnostics;
  7. namespace Microsoft.Research.DynamicDataDisplay.Charts.Maps
  8. {
  9. /// <summary>
  10. /// Represents an unordered set of values.
  11. /// </summary>
  12. /// <typeparam name="T">Type of values.</typeparam>
  13. [DebuggerDisplay("Count = {Count}")]
  14. public sealed class Set<T> : IEnumerable<T>
  15. {
  16. private readonly Dictionary<T, Dummy> cache = new Dictionary<T, Dummy>();
  17. public void Add(T item)
  18. {
  19. cache.Add(item, Dummy.Instance);
  20. }
  21. public bool TryAdd(T item)
  22. {
  23. if (!Contains(item))
  24. {
  25. Add(item);
  26. return true;
  27. }
  28. return false;
  29. }
  30. public bool Remove(T item)
  31. {
  32. bool contains = cache.ContainsKey(item);
  33. bool result = cache.Remove(item);
  34. if (contains)
  35. {
  36. Debug.Assert(!cache.ContainsKey(item));
  37. }
  38. return result;
  39. }
  40. public bool Contains(T item)
  41. {
  42. return cache.ContainsKey(item);
  43. }
  44. private class Dummy
  45. {
  46. public static readonly Dummy Instance = new Dummy();
  47. }
  48. #region IEnumerable<T> Members
  49. public IEnumerator<T> GetEnumerator()
  50. {
  51. return cache.Keys.GetEnumerator();
  52. }
  53. #endregion
  54. #region IEnumerable Members
  55. IEnumerator IEnumerable.GetEnumerator()
  56. {
  57. return GetEnumerator();
  58. }
  59. #endregion
  60. public void Clear()
  61. {
  62. cache.Clear();
  63. }
  64. public int Count
  65. {
  66. get { return cache.Count; }
  67. }
  68. }
  69. }