簡體   English   中英

Rx.net中SelectMany的反向結果

[英]Reverse result from SelectMany in Rx.net

我已經完成了一些有關反應式linq(也稱為Rx.NET)的研究。 我已經看到,SelectMany方法的行為最終產生了以下結果:將可觀察內容的內容展平,從而使它從許多流變為單個流。 我的問題是,是否有一種方法的作用恰恰相反? 意思是在將多個事件流放在一個可觀察的( 多路復用 )中之后,將如何實現呢? 我知道GroupBy的行為與我要求的行為非常相似,只是缺少一件事:我希望對一個可能尚未發出的密鑰進行觀察。

我當時正在考慮自己執行行為,但是如果有機會,我會錯過這種方法的存在,請告訴我我錯了,而且實際上存在!

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM