首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Rx合并到数组

如何使用Rx合并到数组
EN

Stack Overflow用户
提问于 2019-08-15 20:13:32
回答 3查看 338关注 0票数 1

我需要使用UniRx合并2个数组,以便得到可观察的,它发出数组的第一个元素,然后是第二个元素,依此类推,然后发出最长数组的其余部分

我尝试了Zip,但是Zip减少了最长数组的尾部,我尝试用Scheduler.DefaultSchedulers.Iteration合并,但是它启动了一个我不想要的并行线程

代码语言:javascript
复制
var x1 = new[] {1, 2, 3}.ToObservable();
var x2 = new[] {4, 5, 6, 7, 8, 9}.ToObservable();
var merge = x1.Merge(x2);
merge.Subscribe(i => print(i));

我以为是1 4 2 5 3 6 7 8 9我得到了1 2 3 4 5 6 7 8 9

EN

回答 3

Stack Overflow用户

发布于 2019-08-19 16:55:08

正如您所期望的那样,这对我很有效:

代码语言:javascript
复制
var a1 = new int[] { 1, 2, 3 };
var a2 = new int[] { 4, 5, 6, 7, 8, 9 };

var x1 = a1.Select(x => (int?)x).ToObservable().Concat(Observable.Repeat((int?)null));
var x2 = a2.Select(x => (int?)x).ToObservable().Concat(Observable.Repeat((int?)null));

var query =
    x1
        .Zip(x2, (i1, i2) => new [] { i1, i2 })
        .TakeWhile(xs => !(xs[0] == null && xs[1] == null))
        .SelectMany(xs => xs)
        .Where(x => x != null)
        .Select(x => x.Value);

票数 1
EN

Stack Overflow用户

发布于 2019-08-15 21:04:41

如果您知道数组的长度,可以将Zip序列与其他两个序列连接起来,并跳过已压缩的元素的数量。这是C#,但应该会让您有所了解:

代码语言:javascript
复制
var a1 = new int[] { 1, 2, 3 };
var a2 = new int[] { 4, 5, 6, 7, 8, 9 };

var x1 = a1.ToObservable();
var x2 = a2.ToObservable();

int skip = Math.Min(a1.Length, a2.Length);
Observable.Zip(x1, x2).SelectMany(x => x)
    .Concat(x1.Skip(skip))
    .Concat(x2.Skip(skip))
    .Subscribe(i => Console.WriteLine(i));

谢谢,此代码适用于数组。但是,在无法访问Length的情况下,如何为通用IObservable<int>实现此操作?

您可以随时计算压缩后的可观察对象中的元素数量:

代码语言:javascript
复制
var x1 = new int[] { 1, 2, 3 }.ToObservable();
var x2 = new int[] { 4, 5, 6, 7, 8, 9 }.ToObservable();

var zip = Observable.Zip(x1, x2);
int skip = await zip.Count().LastAsync();

zip.SelectMany(x => x)
    .Concat(x1.Skip(skip))
    .Concat(x2.Skip(skip))
    .Subscribe(i => Console.WriteLine(i));
票数 0
EN

Stack Overflow用户

发布于 2019-08-16 22:28:53

@mm8发布的解决方案将使用两个具有定义结束的可观察对象(就像伪装成可观察对象的数组),但将永远挂起无限个可观察对象,这是一种常见的情况。例如:

代码语言:javascript
复制
var odds = Observable.Interval(TimeSpan.FromMilliseconds(10))
    .Select(i => i * 2 + 1);
var evens = Observable.Interval(TimeSpan.FromMilliseconds(10))
    .Select(i => i * 2);

var zip = Observable.Zip(evens, odds);
int skip = await zip.Count().LastAsync();

// Hangs forever here.

如果你想交错数组,最好的方法就是交错为数组。Rx是用来处理可观察对象的。这不是一个可观察到的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57509466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档