using System.Collections.Generic; namespace Base { public class MultiMap { private readonly SortedDictionary> dictionary = new SortedDictionary>(); public SortedDictionary>.KeyCollection Keys { get { return this.dictionary.Keys; } } public void Add(T t, K k) { List list; this.dictionary.TryGetValue(t, out list); if (list == null) { list = new List(); } list.Add(k); this.dictionary[t] = list; } public bool Remove(T t, K k) { List list; this.dictionary.TryGetValue(t, out list); if (list == null) { return false; } if (!list.Remove(k)) { return false; } if (list.Count == 0) { this.dictionary.Remove(t); } return true; } public bool Remove(T t) { return this.dictionary.Remove(t); } /// /// 不返回内部的list,copy一份出来 /// /// /// public K[] GetAll(T t) { List list; this.dictionary.TryGetValue(t, out list); if (list == null) { return new K[0]; } var newList = new List(); foreach (K k in list) { newList.Add(k); } return newList.ToArray(); } /// /// 返回内部的list /// /// /// public List this[T t] { get { List list; this.dictionary.TryGetValue(t, out list); return list; } } public K GetOne(T t) { List list; this.dictionary.TryGetValue(t, out list); if ((list != null) && (list.Count > 0)) { return list[0]; } return default(K); } public bool Contains(T t, K k) { List list; this.dictionary.TryGetValue(t, out list); if (list == null) { return false; } return list.Contains(k); } } }