基本上,我有一个可观察的输入字符串,我想单独处理,然后对结果做一些事情.如果输入字符串包含逗号(作为分隔符),我想分割字符串并单独处理每个子字符串,然后对每个字符串序列执行某些操作.下面的代码段说明了我尝试做的简化版本:
[Fact]
public void UniTest1()
{
var observable = new ReplaySubject<string>();
observable.OnNext("a,b");
observable.OnNext("c,d,e");
observable.OnCompleted();
var result = new List<string[]>();
observable
.SelectMany(x => x.Split(','))
.Select(x => x.ToUpper())
.ToArray() // How to collect an IEnumerable for each item here?
.Do(s => result.Add(s))
.Subscribe();
// Here, result is actually {{"A","B","C","D","E"}}, I need {{"A","B"},{"C","D","E"}}
Assert.Equal(2, result.Count);
Assert.Equal("A", result[0][0]);
Assert.Equal("B", result[0][1]);
Assert.Equal("C", result[1][0]);
Assert.Equal("D", result[1][1]);
Assert.Equal("E", result[1][2]);
}
Run Code Online (Sandbox Code Playgroud)
正如评论中所解释的,上述方法不起作用..ToArray() - 调用将整个observable连接成一个序列.
但是,我已经通过将拆分和处理放入单个操作来解决这个问题,如下所示:
[Fact]
public void UniTest2()
{
var observable = new ReplaySubject<string>();
observable.OnNext("a,b");
observable.OnNext("c,d,e");
observable.OnCompleted(); …
Run Code Online (Sandbox Code Playgroud)