[英]Reverse result from SelectMany in Rx.net
GroupBy
是您想要的,但是正如您所指出的,它確實不足以預先創建“已知”組。 但是,我想您可以發揮創造力,並為每個已知組的值播種序列,如下所示:
如果來源是這樣的
Observable.Interval(TimeSpan.FromMilliseconds(100))
.GroupBy(i => i % 4)
您可以將其修改為類似
var seed = new[] { 0L, 1L, 2L, 3L }.ToObservable();
Observable.Concat(seed, Observable.Interval(TimeSpan.FromMilliseconds(100)))
.GroupBy(i => i % 4)
.Select(grp=>grp.Skip(1)) //Ignore the first/seed value.
您對GroupBy
是正確的。 可以很容易地將其設置為提前預訂任何密鑰。 只要這樣做:
IObservable<int> oddNumbers =
Observable
.Range(0, 10)
.GroupBy(x => x % 2)
.Where(gx => gx.Key == 1)
.Merge();
如果我訂閱,我將獲得:
1 3 5 7 9
但是,這有點浪費時間,因為這直接等同於:
IObservable<int> oddNumbers =
Observable
.Range(0, 10)
.Where(x => x % 2 == 1);
我看到它可能有用的唯一方法是:
IConnectableObservable<IGroupedObservable<int, int>> groupedNumbers =
Observable
.Range(0, 10)
.GroupBy(x => x % 2)
.Publish();
Func<IConnectableObservable<IGroupedObservable<int, int>>, int, IObservable<int>> anyProject =
(source, key) =>
source
.Where(gx => gx.Key == key)
.Merge();
IObservable<int> oddNumbers = anyProject(groupedNumbers, 1);
oddNumbers.Subscribe(x => Console.WriteLine(x));
groupedNumbers.Connect();
那仍然給了我奇數,但是我現在可以創建可觀察的偶數而無需開始新的分組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.