Ejemplo n.º 1
0
        /// <summary>
        /// Removes the specified element from a <see cref="IndexedCollection{T}"/>.
        /// </summary>
        /// <param name="item"> The element to remove. </param>
        /// <returns>
        /// true if the element is successfully found and removed; otherwise, false.
        /// This method returns false if item is not found in the <see cref="IndexedCollection{T}"/>.
        /// </returns>
        /// <exception cref="ArgumentNullException"> <paramref name="item"/> is null. </exception>
        public bool Remove(T item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            if (_storage.TryGetValue(item, out List <object> indexKeys))
            {
                for (int i = 0; i < _indexes.Count; i++)
                {
                    IEqualityIndex <T> index   = _indexes[i];
                    object             lastKey = indexKeys[i];

                    index.Remove(lastKey, item);
                }

                _storage.Remove(item);

                if (item is INotifyPropertyChanged observable)
                {
                    observable.PropertyChanged -= OnPropertyChanged;
                }

                return(true);
            }
            else
            {
                return(false);
            }
        }
Ejemplo n.º 2
0
        /// <exception cref="NotSupportedException" />
        /// <exception cref="InvalidOperationException" />
        private IEnumerable <T> FilterEquality(Expression memberExpression, Expression keyExpression)
        {
            string memberName = memberExpression.GetMemberName();

            IEqualityIndex <T> index = _indexes.Find(i => i.MemberName == memberName);

            if (index == null)
            {
                throw new InvalidOperationException($"There is no index for property '{memberName}'");
            }

            return(index.Filter(keyExpression.GetValue()));
        }
Ejemplo n.º 3
0
        private void IndexBy(IEqualityIndex <T> index)
        {
            foreach (var pair in _storage)
            {
                T             item      = pair.Key;
                List <object> indexKeys = pair.Value;

                object key = index.GetKey(item);

                indexKeys.Add(key);
                index.Add(key, item);
            }

            _indexes.Add(index);
        }
Ejemplo n.º 4
0
        private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            int pointer = _indexes.FindIndex(i => i.MemberName == e.PropertyName);

            if (pointer != -1 && sender is T item &&
                _storage.TryGetValue(item, out List <object> indexKeys))
            {
                IEqualityIndex <T> index      = _indexes[pointer];
                object             currentKey = index.GetKey(item);
                object             lastKey    = indexKeys[pointer];

                indexKeys[pointer] = currentKey;
                index.Remove(lastKey, item);
                index.Add(currentKey, item);
            }
        }
Ejemplo n.º 5
0
        private void AddOrUpdate(T item)
        {
            if (_storage.TryGetValue(item, out List <object> indexKeys))
            {
                for (int i = 0; i < _indexes.Count; i++)
                {
                    IEqualityIndex <T> index      = _indexes[i];
                    object             currentKey = index.GetKey(item);
                    object             lastKey    = indexKeys[i];

                    if (!Equals(lastKey, currentKey))
                    {
                        indexKeys[i] = currentKey;
                        index.Remove(lastKey, item);
                        index.Add(currentKey, item);
                    }
                }
            }
            else
            {
                indexKeys = new List <object>(_indexes.Count);

                foreach (IEqualityIndex <T> index in _indexes)
                {
                    object key = index.GetKey(item);

                    indexKeys.Add(key);
                    index.Add(key, item);
                }

                _storage.Add(item, indexKeys);

                if (item is INotifyPropertyChanged observable)
                {
                    observable.PropertyChanged += OnPropertyChanged;
                }
            }
        }