diff --git a/Rx.NET/Source/src/System.Reactive/Linq/Observable/MaxBy.cs b/Rx.NET/Source/src/System.Reactive/Linq/Observable/MaxBy.cs index 643adc24ea..7073a76412 100644 --- a/Rx.NET/Source/src/System.Reactive/Linq/Observable/MaxBy.cs +++ b/Rx.NET/Source/src/System.Reactive/Linq/Observable/MaxBy.cs @@ -25,7 +25,8 @@ public MaxBy(IObservable source, Func keySelector, IComp internal sealed class _ : Sink> { - private readonly MaxBy _parent; + readonly Func _keySelector; + readonly IComparer _comparer; private bool _hasValue; private TKey _lastKey; private List _list; @@ -33,10 +34,9 @@ internal sealed class _ : Sink> public _(MaxBy parent, IObserver> observer) : base(observer) { - _parent = parent; + _keySelector = parent._keySelector; + _comparer = parent._comparer; - _hasValue = false; - _lastKey = default(TKey); _list = new List(); } @@ -45,10 +45,12 @@ public override void OnNext(TSource value) var key = default(TKey); try { - key = _parent._keySelector(value); + key = _keySelector(value); } catch (Exception ex) { + _list = null; + _lastKey = default; ForwardOnError(ex); return; } @@ -64,10 +66,12 @@ public override void OnNext(TSource value) { try { - comparison = _parent._comparer.Compare(key, _lastKey); + comparison = _comparer.Compare(key, _lastKey); } catch (Exception ex) { + _list = null; + _lastKey = default; ForwardOnError(ex); return; } @@ -85,9 +89,19 @@ public override void OnNext(TSource value) } } + public override void OnError(Exception error) + { + _lastKey = default; + _list = null; + base.OnError(error); + } + public override void OnCompleted() { - ForwardOnNext(_list); + var list = _list; + _list = null; + _lastKey = default; + ForwardOnNext(list); ForwardOnCompleted(); } }