If you want the last element to be included, you can only combine the stream with the last element together with the regular stream in combination with TakeWhile . Here is a simple console application to prove it:
var subject = new List<string> { "test", "last" }.ToObservable(); var my = subject .Where(x => x == "last").Take(1) .Merge(subject.TakeWhile(x => x != "last")); my.Subscribe( o => Console.WriteLine("On Next: " + o), () => Console.WriteLine("Completed")); Console.ReadLine();
Fingerprints:
On Next: test On Next: last Completed
UPDATE There was an error that suppressed the OnCompleted message if the underlying Observable did not actually complete. I fixed the code to ensure that OnCompleted receives the call
And if you want to avoid subscribing to the base sequence several times for cold observables, you can reorganize the code as follows:
var my = subject.Publish(p => p .Where(x => x == "last").Take(1) .Merge(p.TakeWhile(x => x != "last")));
source share