ぼくのかんがえたSortedList
SortedList<TKey, TValueがIList<T>インターフェースを実装せず、SortedDictionary<TKey, TValue>との違いがよくわからんかったので、List<T>のSorted版を作ってみた。
ObservableCollection<T>を使っても良かったけど一応基本のみで。
public class SortedList<T> : Collection<T> { private Comparison<T> comparision; /// <summary> /// SortedList<T>を初期化する /// </summary> /// <exception cref="NotImplementedException">TがIComparableまたはIComparable<T>を実装していない場合に発生</exception> public SortedList() : base(new List<T>()) { //IComparable<T>が実装されている場合、その比較メソッドを利用 if (ExistInterface<IComparable<T>>()) { this.comparision = (v1, v2) => ((IComparable<T>)v1).CompareTo(v2); } //IComparableが実装されている場合、その比較メソッドを利用 else if (ExistInterface<IComparable>()) { this.comparision = (v1, v2) => ((IComparable)v1).CompareTo(v2); } //どちらも実装されていない場合、比較できないのでデリゲータ指定コンストラクタの利用を指示 else { throw new NotImplementedException("IComparable<T> and IComparable is not implemented in " + typeof(T).Name + ". Use SortedList(Comparison<T>) constructor."); } } /// <summary> /// SortedList<T>を初期化する /// </summary> /// <param name="comparision">ソートに利用するデリゲートメソッド</param> public SortedList(Comparison<T> comparision) : base(new List<T>()) { this.comparision = comparision; } protected override void InsertItem(int index, T item) { base.InsertItem(index, item); Sort(); } protected override void SetItem(int index, T item) { base.SetItem(index, item); Sort(); } private void Sort() { ((List<T>)Items).Sort(comparision); } /// <summary> /// Tに指定したインターフェースが実装されているかを調べる /// </summary> /// <typeparam name="TInterface"></typeparam> /// <returns></returns> private bool ExistInterface<TInterface>() { return Array.Exists(typeof(T).GetInterfaces(), (t) => t == typeof(TInterface)); } }
処理速度? 知らねー。