/// <summary> /// Will use InsertAdapter and Comparer and IFilter if they are set /// </summary> /// <param name="item"></param> /// <returns></returns> public int InsertSorted(T item) { lock (_lock) { //if using an insert adapter, generate the new item if (InsertAdapter != null) { item = InsertAdapter.CreateItem(item); } //if it's not comparable, then just add it natural order if (!(item is IComparable) && Comparer == null) { InsertItem(Count, item); return(Count - 1); } if (Count == 0) { InsertItem(Count, item); return(0); } int left = 0; int right = Count - 1; int middle = right / 2; while (left < right) { int compare = compareItems(item, this[middle]); if (compare > 0) //this item is later { left = middle + 1; middle = (right + left) / 2; } else if (compare < 0) //this item is sooner { right = middle - 1; middle = (right + left) / 2; } else //equal { left = middle + 1; right = left; break; } } while (left < Count && compareItems(item, this[left]) >= 0) { left++; } InsertItem(left, item); return(left); } }
internal MyObservableSublistSortSameAsParent(MyObservableList <T> parentList, IFilter <T> filter, InsertAdapter <T> insertAdapter) : base(parentList, SublistSortOption.SameAsParentList, filter, null, insertAdapter) { }
public MyObservableSublist(MyObservableList <T> parentList, SublistSortOption sortOption, IFilter <T> filter, IComparer <T> comparer, InsertAdapter <T> insertAdapter) { if (parentList == null) { throw new ArgumentNullException("parentList cannot be null"); } base.Filter = filter; base.Comparer = comparer; base.InsertAdapter = insertAdapter; ParentList = parentList; SortOption = sortOption; Reset(); parentList.CollectionChanged += parentList_CollectionChanged; }