Пример #1
0
        private void OnJoinerRemoved(ActiveListJoinerData <TLeft, TRight, TResult, TKey> data)
        {
            if (data.IsLeftJoiner)
            {
                _leftJoiners.Remove(data.SourceIndex);

                for (int i = data.SourceIndex; i < _leftJoiners.Count; ++i)
                {
                    _leftJoiners[i].SourceIndex = i;
                }
            }
            else
            {
                _rightJoiners.Remove(data.SourceIndex);

                for (int i = data.SourceIndex; i < _rightJoiners.Count; ++i)
                {
                    _rightJoiners[i].SourceIndex = i;
                }
            }

            UpdateIndices(data.GetTargetIndex(_leftJoiners.Count));
        }
Пример #2
0
        private void OnJoinerAdded(ActiveListJoinerData <TLeft, TRight, TResult, TKey> data)
        {
            if (data.IsLeftJoiner)
            {
                _leftJoiners.Add(data.SourceIndex, data);

                for (int i = data.SourceIndex + 1; i < _leftJoiners.Count; ++i)
                {
                    _leftJoiners[i].SourceIndex = i;
                }
            }
            else
            {
                _rightJoiners.Add(data.SourceIndex, data);

                for (int i = data.SourceIndex + 1; i < _rightJoiners.Count; ++i)
                {
                    _rightJoiners[i].SourceIndex = i;
                }
            }

            UpdateIndices(data.GetTargetIndex(_leftJoiners.Count));

            data.Joiner.AddRequested += (index, value) =>
            {
                ++data.Count;

                UpdateIndices(data.GetTargetIndex(_leftJoiners.Count));

                _resultList.Add(data.Offset + index, value);
            };
            data.Joiner.RemoveRequested += index =>
            {
                --data.Count;

                UpdateIndices(data.GetTargetIndex(_leftJoiners.Count));

                _resultList.Remove(data.Offset + index);
            };
            data.Joiner.ReplaceRequested += (index, newValue) =>
            {
                _resultList.Replace(data.Offset + index, newValue);
            };
            data.Joiner.ReplaceRangeRequested += (index, oldCount, values) =>
            {
                var diff = values.Count - oldCount;

                if (diff != 0)
                {
                    data.Count += diff;

                    UpdateIndices(data.GetTargetIndex(_leftJoiners.Count));
                }

                _resultList.ReplaceRange(data.Offset + index, oldCount, values);
            };
            data.Joiner.MoveRequested += (oldIndex, newIndex) =>
            {
                _resultList.Move(data.Offset + oldIndex, data.Offset + newIndex);
            };
            data.Joiner.MoveRangeRequested += (oldIndex, newIndex, count) =>
            {
                _resultList.MoveRange(data.Offset + oldIndex, data.Offset + newIndex, count);
            };
            data.Joiner.ResetRequested += values =>
            {
                var newValues = values.ToArray();

                var oldCount = data.Count;
                if (data.Count != newValues.Length)
                {
                    data.Count = newValues.Length;

                    UpdateIndices(data.GetTargetIndex(_leftJoiners.Count));
                }

                _resultList.ReplaceRange(data.Offset, oldCount, newValues);
            };
        }