ここで風邪を引いObservable
ていて、「グループ化」を数回購読しているのに、なぜここで公開する必要がないのですか?実行すると望ましくない結果が生じると予想していましたが、驚いたことに、公開の有無にかかわらず機能します。何故ですか?
var subject = new List<string>
{
"test",
"test",
"hallo",
"test",
"hallo"
}.ToObservable();
subject
.GroupBy(x => x)
.SelectMany(grouped => grouped.Scan(0, (count, _) => ++count)
.Zip(grouped, (count, chars) => new { Chars = chars, Count = count }))
.Subscribe(result => Console.WriteLine("You typed {0} {1} times",
result.Chars, result.Count));
// I Would have expect that I need to use Publish like that
//subject
// .GroupBy(x => x)
// .SelectMany(grouped => grouped.Publish(sharedGroup =>
// sharedGroup.Scan(0, (count, _) => ++count)
// .Zip(sharedGroup, (count, chars) =>
// new { Chars = chars, Count = count })))
// .Subscribe(result => Console.WriteLine("You typed {0} {1} times",
// result.Chars, result.Count));
Console.ReadLine();
編集
Paulが気付いたように、基礎となるコールドオブザーバブルを2回サブスクライブしているので、シーケンスを2回確認する必要があります。しかし、私はこの効果を目に見えるようにすることができませんでした。デバッグ行を挿入しようとしましたが、たとえば、これは「実行中」を1回だけ出力します。
var subject = new List<Func<string>>
{
() =>
{
Console.WriteLine("performing");
return "test";
},
() => "test",
() => "hallo",
() => "test",
() => "hallo"
}.ToObservable();
subject
.Select(x => x())
.GroupBy(x => x)
.SelectMany(grouped => grouped.Scan(0, (count, _) => ++count)
.Zip(grouped, (count, chars) => new { Chars = chars, Count = count }))
.Subscribe(result => Console.WriteLine("You typed {0} {1} times",
result.Chars, result.Count));
コールドオブザーバブルを扱っていて、使用していないという効果を可視化できるのではないかと思いますPublish()
。別のステップでは、(上記を参照)どのようにPublish()
効果がなくなるかを確認したいと思います。
編集2
Paulが提案したように、私IObservable<string>
はデバッグ目的でカスタムを作成しました。ただし、そのメソッドにブレークポイントを設定すると、一度Subscribe()
だけヒットすることに気付くでしょう。
class Program
{
static void Main(string[] args)
{
var subject = new MyObservable();
subject
.GroupBy(x => x)
.SelectMany(grouped => grouped.Scan(0, (count, _) => ++count)
.Zip(grouped, (count, chars) => new { Chars = chars, Count = count }))
.Subscribe(result => Console.WriteLine("You typed {0} {1} times",
result.Chars, result.Count));
Console.ReadLine();
}
}
class MyObservable : IObservable<string>
{
public IDisposable Subscribe(IObserver<string> observer)
{
observer.OnNext("test");
observer.OnNext("test");
observer.OnNext("hallo");
observer.OnNext("test");
observer.OnNext("hallo");
return Disposable.Empty;
}
}
だから私にとって、質問はまだ開いています。なぜ私はPublish
この寒さでここを必要としないのObservable
ですか?