PageRenderTime 40ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/source/library/Interlace/Collections/DictionaryOfLists.cs

https://bitbucket.org/VahidN/interlace
C# | 170 lines | 116 code | 29 blank | 25 comment | 3 complexity | 0c6a023f87472fcf437bb9a66dde111e MD5 | raw file
  1. #region Using Directives and Copyright Notice
  2. // Copyright (c) 2007-2010, Computer Consultancy Pty Ltd
  3. // All rights reserved.
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are met:
  7. // * Redistributions of source code must retain the above copyright
  8. // notice, this list of conditions and the following disclaimer.
  9. // * Redistributions in binary form must reproduce the above copyright
  10. // notice, this list of conditions and the following disclaimer in the
  11. // documentation and/or other materials provided with the distribution.
  12. // * Neither the name of the Computer Consultancy Pty Ltd nor the
  13. // names of its contributors may be used to endorse or promote products
  14. // derived from this software without specific prior written permission.
  15. //
  16. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. // ARE DISCLAIMED. IN NO EVENT SHALL COMPUTER CONSULTANCY PTY LTD BE LIABLE
  20. // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  24. // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  25. // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  26. // DAMAGE.
  27. using System;
  28. using System.Collections.Generic;
  29. using System.Collections.ObjectModel;
  30. using System.Text;
  31. #endregion
  32. namespace Interlace.Collections
  33. {
  34. public class DictionaryOfLists<TKey, TValue> : IEnumerable<KeyValuePair<TKey, ICollection<TValue>>>
  35. {
  36. Dictionary<TKey, List<TValue>> _dictionary;
  37. readonly ReadOnlyCollection<TValue> _emptyCollection =
  38. new ReadOnlyCollection<TValue>(new List<TValue>());
  39. public DictionaryOfLists()
  40. {
  41. _dictionary = new Dictionary<TKey, List<TValue>>();
  42. }
  43. public IEnumerable<TKey> Keys
  44. {
  45. get { return _dictionary.Keys; }
  46. }
  47. public void Add(TKey key, TValue value)
  48. {
  49. List<TValue> list;
  50. bool exists = _dictionary.TryGetValue(key, out list);
  51. if (!exists)
  52. {
  53. list = new List<TValue>();
  54. _dictionary[key] = list;
  55. }
  56. list.Add(value);
  57. }
  58. public void Add(TKey key, ICollection<TValue> values)
  59. {
  60. List<TValue> list;
  61. bool exists = _dictionary.TryGetValue(key, out list);
  62. if (!exists)
  63. {
  64. list = new List<TValue>();
  65. _dictionary[key] = list;
  66. }
  67. foreach (TValue value in values)
  68. {
  69. list.Add(value);
  70. }
  71. }
  72. public void Clear()
  73. {
  74. _dictionary.Clear();
  75. }
  76. public void Clear(TKey key)
  77. {
  78. _dictionary.Remove(key);
  79. }
  80. public ICollection<TValue> this[TKey key]
  81. {
  82. get
  83. {
  84. List<TValue> list;
  85. bool exists = _dictionary.TryGetValue(key, out list);
  86. if (exists)
  87. {
  88. return new ReadOnlyCollection<TValue>(list);
  89. }
  90. else
  91. {
  92. return _emptyCollection;
  93. }
  94. }
  95. }
  96. public IEnumerator<KeyValuePair<TKey, ICollection<TValue>>> GetEnumerator()
  97. {
  98. return new Enumerator(_dictionary.GetEnumerator());
  99. }
  100. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  101. {
  102. return new Enumerator(_dictionary.GetEnumerator());
  103. }
  104. class Enumerator : IEnumerator<KeyValuePair<TKey, ICollection<TValue>>>
  105. {
  106. IEnumerator<KeyValuePair<TKey, List<TValue>>> _baseEnumerator;
  107. public Enumerator(IEnumerator<KeyValuePair<TKey, List<TValue>>> baseEnumerator)
  108. {
  109. _baseEnumerator = baseEnumerator;
  110. }
  111. public KeyValuePair<TKey, ICollection<TValue>> Current
  112. {
  113. get
  114. {
  115. KeyValuePair<TKey, List<TValue>> pair = _baseEnumerator.Current;
  116. return new KeyValuePair<TKey, ICollection<TValue>>(
  117. pair.Key, new ReadOnlyCollection<TValue>(pair.Value));
  118. }
  119. }
  120. public void Dispose()
  121. {
  122. _baseEnumerator.Dispose();
  123. }
  124. object System.Collections.IEnumerator.Current
  125. {
  126. get
  127. {
  128. return Current;
  129. }
  130. }
  131. public bool MoveNext()
  132. {
  133. return _baseEnumerator.MoveNext();
  134. }
  135. public void Reset()
  136. {
  137. _baseEnumerator.Reset();
  138. }
  139. }
  140. }
  141. }