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)); }
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); }; }