Exemple #1
0
        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();
        }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
 /// <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);
     }
 }
Exemple #4
0
        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();
        }
Exemple #5
0
        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;
        }
Exemple #6
0
        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);
            }
        }