internal AutoIndex(IReadOnlyCollection <TV> src, Func <TV, TK> GetKeyMethod, IReadOnlyCollection <TK> KeysSource) { Contract.AllIsNotNull(src, GetKeyMethod); _src = src; _keys = KeysSource; _getkey = GetKeyMethod; _adder = new EventReceiver <ObjectEventArgs>((x, y) => this.OnAddElement((TV)y.Arg)); _remover = new EventReceiver <ObjectEventArgs>((x, y) => this.OnRemoveElement((TV)y.Arg)); _updater = new EventReceiver(RebuildIndex); _KAdder = new EventReceiver <ObjectEventArgs>((x, y) => this.OnAddKey((TK)y.Arg)); _KRemover = new EventReceiver <ObjectEventArgs>((x, y) => this.OnRemoveKey((TK)y.Arg)); _KUpdater = new EventReceiver(RebuildKeys); if (_keys != null) { RebuildKeys(); } else { BuildIndex(); } AdviseEvents(); }
/// <summary> /// Сортирует коллекцию по месту /// </summary> public static void SortInPlace <T>(this ObservableCollection <T> collection, Comparison <T> comparer) { Contract.AllIsNotNull(collection, comparer); //если в коллекции только 1 элемент или меньще, то она автоматически отсортирована if (collection.Count < 2) { return; } //инвариант цикла : все что от 0 до sortedBound - уже отсортировано for (int sortedBound = 0; sortedBound < collection.Count - 1; sortedBound++) { T currentMax = collection[sortedBound]; T testVal = collection[sortedBound + 1]; int compareResult = comparer(currentMax, testVal); //действие цикла //взять элемент [sortedBound - 1] и сравнить с [sortedBound] //если порядок сохранен - переходим дальше if (compareResult <= 0) //i.e. currentMax <= testVal { continue; } //если порядок нарушен - то найти ему место и передвинуть int newIndex = FindIndex(collection, 0, sortedBound, collection[sortedBound + 1], comparer); collection.Move(sortedBound + 1, newIndex); } }
/// <summary> /// Добавить к коллекции перечисление /// </summary> public static void AddRange <T>(this ICollection <T> targetCollection, IEnumerable <T> items) { Contract.AllIsNotNull(targetCollection, items); foreach (var x in items) { targetCollection.Add(x); } }
public Setter(Action <T> setter, Function <T> src) { Contract.AllIsNotNull(setter, src); src.Changed += new EventHandler(src_Changed); _src = src; _setter = setter; _myDispatcher = Dispatcher.CurrentDispatcher; Recalculate(); }
public Function(IWeakEvent[] changeTriggers, object target, Func <object, TV> getter) { Contract.AllIsNotNull(changeTriggers, target, getter); _receiver = new EventReceiver(OnTrigger); foreach (var trig in changeTriggers) { trig.AddReceiver(_receiver); } _target = new WeakReference(target, false); _getter = getter; }
public static void Delay(this Dispatcher d, Action a) { Contract.AllIsNotNull(d, a); Actions.Enqueue(a); if (!isDelayRunning) { isDelayRunning = true; d.BeginInvoke(DispatcherPriority.Background, new Action <Dispatcher>(ProcessPortion), d); } }