Ejemplo n.º 1
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.º 2
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.º 3
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;
                }
            }
        }