using System; using System.Collections.Generic; namespace ET { public class MultiMap: //#if UNITY // SortedLinkList> //#else SortedDictionary> //#endif { private readonly List Empty = new(); private readonly int maxPoolCount; private readonly Queue> pool; public MultiMap(int maxPoolCount = 0) { this.maxPoolCount = maxPoolCount; this.pool = new Queue>(maxPoolCount); } private List FetchList() { if (this.pool.Count > 0) { return this.pool.Dequeue(); } return new List(10); } private void Recycle(List list) { if (list == null) { return; } if (this.pool.Count == this.maxPoolCount) { return; } list.Clear(); this.pool.Enqueue(list); } public void Add(T t, K k) { List list; this.TryGetValue(t, out list); if (list == null) { list = this.FetchList(); this.Add(t, list); } list.Add(k); } public bool Remove(T t, K k) { List list; this.TryGetValue(t, out list); if (list == null) { return false; } if (!list.Remove(k)) { return false; } if (list.Count == 0) { this.Remove(t); } return true; } public new bool Remove(T t) { List list; this.TryGetValue(t, out list); if (list == null) { return false; } this.Recycle(list); return base.Remove(t); } /// /// 不返回内部的list,copy一份出来 /// /// /// public K[] GetAll(T t) { List list; this.TryGetValue(t, out list); if (list == null) { return Array.Empty(); } return list.ToArray(); } /// /// 返回内部的list /// /// /// public new List this[T t] { get { this.TryGetValue(t, out List list); return list ?? Empty; } } public K GetOne(T t) { List list; this.TryGetValue(t, out list); if (list != null && list.Count > 0) { return list[0]; } return default; } public bool Contains(T t, K k) { List list; this.TryGetValue(t, out list); if (list == null) { return false; } return list.Contains(k); } } }