Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Rx.net中的SelectMany返回结果_C#_Linq_System.reactive - Fatal编程技术网

C# 从Rx.net中的SelectMany返回结果

C# 从Rx.net中的SelectMany返回结果,c#,linq,system.reactive,C#,Linq,System.reactive,我做了一些关于反应性linq(也称为Rx.NET)的研究。我已经看到SelectMany方法的行为是以下最终结果:将observable中的内容展平,使其从多个流变为单个流。我的问题是,有没有一种方法的作用方向正好相反?这意味着在一个可观察()中放置多个事件流之后,如何实现这一点?我知道它的行为与我的请求非常相似,只是缺少一件事:我想要一个可能还没有发出的键的可观测值 我想自己实施这个行为,但如果有机会,我错过了这种方法的存在,请告诉我,我错了,它确实存在 GroupBy是您正在寻找的,但正如您

我做了一些关于反应性linq(也称为Rx.NET)的研究。我已经看到SelectMany方法的行为是以下最终结果:将observable中的内容展平,使其从多个流变为单个流。我的问题是,有没有一种方法的作用方向正好相反?这意味着在一个可观察()中放置多个事件流之后,如何实现这一点?我知道它的行为与我的请求非常相似,只是缺少一件事:我想要一个可能还没有发出的键的可观测值


我想自己实施这个行为,但如果有机会,我错过了这种方法的存在,请告诉我,我错了,它确实存在

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
是一样的。你能详细说明一下吗?