//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; namespace GameFramework { /// /// 游戏框架多值字典类。 /// /// 指定多值字典的主键类型。 /// 指定多值字典的值类型。 public sealed class GameFrameworkMultiDictionary : IEnumerable>>, IEnumerable { private readonly GameFrameworkLinkedList m_LinkedList; private readonly Dictionary> m_Dictionary; /// /// 初始化游戏框架多值字典类的新实例。 /// public GameFrameworkMultiDictionary() { m_LinkedList = new GameFrameworkLinkedList(); m_Dictionary = new Dictionary>(); } /// /// 获取多值字典中实际包含的主键数量。 /// public int Count { get { return m_Dictionary.Count; } } /// /// 获取多值字典中指定主键的范围。 /// /// 指定的主键。 /// 指定主键的范围。 public GameFrameworkLinkedListRange this[TKey key] { get { GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange); m_Dictionary.TryGetValue(key, out range); return range; } } /// /// 清理多值字典。 /// public void Clear() { m_Dictionary.Clear(); m_LinkedList.Clear(); } /// /// 检查多值字典中是否包含指定主键。 /// /// 要检查的主键。 /// 多值字典中是否包含指定主键。 public bool Contains(TKey key) { return m_Dictionary.ContainsKey(key); } /// /// 检查多值字典中是否包含指定值。 /// /// 要检查的主键。 /// 要检查的值。 /// 多值字典中是否包含指定值。 public bool Contains(TKey key, TValue value) { GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange); if (m_Dictionary.TryGetValue(key, out range)) { return range.Contains(value); } return false; } /// /// 尝试获取多值字典中指定主键的范围。 /// /// 指定的主键。 /// 指定主键的范围。 /// 是否获取成功。 public bool TryGetValue(TKey key, out GameFrameworkLinkedListRange range) { return m_Dictionary.TryGetValue(key, out range); } /// /// 向指定的主键增加指定的值。 /// /// 指定的主键。 /// 指定的值。 public void Add(TKey key, TValue value) { GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange); if (m_Dictionary.TryGetValue(key, out range)) { m_LinkedList.AddBefore(range.Terminal, value); } else { LinkedListNode first = m_LinkedList.AddLast(value); LinkedListNode terminal = m_LinkedList.AddLast(default(TValue)); m_Dictionary.Add(key, new GameFrameworkLinkedListRange(first, terminal)); } } /// /// 从指定的主键中移除指定的值。 /// /// 指定的主键。 /// 指定的值。 /// 是否移除成功。 public bool Remove(TKey key, TValue value) { GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange); if (m_Dictionary.TryGetValue(key, out range)) { for (LinkedListNode current = range.First; current != null && current != range.Terminal; current = current.Next) { if (current.Value.Equals(value)) { if (current == range.First) { LinkedListNode next = current.Next; if (next == range.Terminal) { m_LinkedList.Remove(next); m_Dictionary.Remove(key); } else { m_Dictionary[key] = new GameFrameworkLinkedListRange(next, range.Terminal); } } m_LinkedList.Remove(current); return true; } } } return false; } /// /// 从指定的主键中移除所有的值。 /// /// 指定的主键。 /// 是否移除成功。 public bool RemoveAll(TKey key) { GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange); if (m_Dictionary.TryGetValue(key, out range)) { m_Dictionary.Remove(key); LinkedListNode current = range.First; while (current != null) { LinkedListNode next = current != range.Terminal ? current.Next : null; m_LinkedList.Remove(current); current = next; } return true; } return false; } /// /// 返回循环访问集合的枚举数。 /// /// 循环访问集合的枚举数。 public Enumerator GetEnumerator() { return new Enumerator(m_Dictionary); } /// /// 返回循环访问集合的枚举数。 /// /// 循环访问集合的枚举数。 IEnumerator>> IEnumerable>>.GetEnumerator() { return GetEnumerator(); } /// /// 返回循环访问集合的枚举数。 /// /// 循环访问集合的枚举数。 IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } /// /// 循环访问集合的枚举数。 /// [StructLayout(LayoutKind.Auto)] public struct Enumerator : IEnumerator>>, IEnumerator { private Dictionary>.Enumerator m_Enumerator; internal Enumerator(Dictionary> dictionary) { if (dictionary == null) { throw new GameFrameworkException("Dictionary is invalid."); } m_Enumerator = dictionary.GetEnumerator(); } /// /// 获取当前结点。 /// public KeyValuePair> Current { get { return m_Enumerator.Current; } } /// /// 获取当前的枚举数。 /// object IEnumerator.Current { get { return m_Enumerator.Current; } } /// /// 清理枚举数。 /// public void Dispose() { m_Enumerator.Dispose(); } /// /// 获取下一个结点。 /// /// 返回下一个结点。 public bool MoveNext() { return m_Enumerator.MoveNext(); } /// /// 重置枚举数。 /// void IEnumerator.Reset() { ((IEnumerator>>)m_Enumerator).Reset(); } } } }