C# 从Rx.net中的SelectMany返回结果
我做了一些关于反应性linq(也称为Rx.NET)的研究。我已经看到SelectMany方法的行为是以下最终结果:将observable中的内容展平,使其从多个流变为单个流。我的问题是,有没有一种方法的作用方向正好相反?这意味着在一个可观察()中放置多个事件流之后,如何实现这一点?我知道它的行为与我的请求非常相似,只是缺少一件事:我想要一个可能还没有发出的键的可观测值C# 从Rx.net中的SelectMany返回结果,c#,linq,system.reactive,C#,Linq,System.reactive,我做了一些关于反应性linq(也称为Rx.NET)的研究。我已经看到SelectMany方法的行为是以下最终结果:将observable中的内容展平,使其从多个流变为单个流。我的问题是,有没有一种方法的作用方向正好相反?这意味着在一个可观察()中放置多个事件流之后,如何实现这一点?我知道它的行为与我的请求非常相似,只是缺少一件事:我想要一个可能还没有发出的键的可观测值 我想自己实施这个行为,但如果有机会,我错过了这种方法的存在,请告诉我,我错了,它确实存在 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
是您要寻找的,但正如您所指出的,它确实无法提前创建“已知”组。然而,我认为你可以富有创造力,为每个已知群体的价值观播种你的序列:
如果来源是这样的话
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();
IObservable奇数=
可观察
.范围(0,10)
.GroupBy(x=>x%2)
.Where(gx=>gx.Key==1)
.Merge();
如果我订阅,我会得到:
1
3
5
7
9
1.
3.
5.
7.
9
但是,这有点浪费时间,因为这直接等同于:
IObservable<int> oddNumbers =
Observable
.Range(0, 10)
.Where(x => x % 2 == 1);
IObservable奇数=
可观察
.范围(0,10)
。式中(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();
IConnectableObservable GroupedNumber=
可观察
.范围(0,10)
.GroupBy(x=>x%2)
.Publish();
Func anyProject=
(来源,键)=>
来源
.Where(gx=>gx.Key==Key)
.Merge();
IObservable oddNumbers=anyProject(groupedNumbers,1);
Subscribe(x=>Console.WriteLine(x));
groupedNumbers.Connect();
这仍然给了我奇数,但我现在可以创建可观察到的偶数,而无需开始新的分组。你是对的,
GroupBy
就是你想要的。很容易将其设置为提前订阅任何密钥。只要这样做:
IObservable<int> oddNumbers =
Observable
.Range(0, 10)
.GroupBy(x => x % 2)
.Where(gx => gx.Key == 1)
.Merge();
IObservable奇数=
可观察
.范围(0,10)
.GroupBy(x=>x%2)
.Where(gx=>gx.Key==1)
.Merge();
如果我订阅,我会得到:
1
3
5
7
9
1.
3.
5.
7.
9
但是,这有点浪费时间,因为这直接等同于:
IObservable<int> oddNumbers =
Observable
.Range(0, 10)
.Where(x => x % 2 == 1);
IObservable奇数=
可观察
.范围(0,10)
。式中(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();
IConnectableObservable GroupedNumber=
可观察
.范围(0,10)
.GroupBy(x=>x%2)
.Publish();
Func anyProject=
(来源,键)=>
来源
.Where(gx=>gx.Key==Key)
.Merge();
IObservable oddNumbers=anyProject(groupedNumbers,1);
Subscribe(x=>Console.WriteLine(x));
groupedNumbers.Connect();
这仍然给了我奇数,但我现在可以创建可观察到的偶数,而无需开始新的分组。我认为
GroupBy
或Where
可以做到这一点。你能用一个简单的来说明这些不足的原因吗?Where
是最明显的答案,因为分组和投影一个尚未出现的组与只做。Where
是一样的。你能详细说明一下吗?我在想GroupBy
或在哪里
能起作用。你能用一个简单的来说明这些不足的原因吗?Where
是最明显的答案,因为分组和投影一个尚未出现的组与只做。Where
是一样的。你能详细说明一下吗?