C# Rx通过在一个属性上连接来组合多个流
我试图在Rx中“压缩”任意数量的流,其中元素对应,但可能被无序处理。每个流的元素都有一个标识符,可用于将它们匹配在一起。例如,元素看起来像:C# Rx通过在一个属性上连接来组合多个流,c#,system.reactive,reactive-programming,C#,System.reactive,Reactive Programming,我试图在Rx中“压缩”任意数量的流,其中元素对应,但可能被无序处理。每个流的元素都有一个标识符,可用于将它们匹配在一起。例如,元素看起来像: public class Element { public string Key {get; set;} } 通常,zip只会根据元素的出现索引组合元素: |-A-----------A |--B---------B- |-----C------C- |-----ABC-----ABC <- zip |-A-------A |--B--
public class Element
{
public string Key {get; set;}
}
通常,zip只会根据元素的出现索引组合元素:
|-A-----------A
|--B---------B-
|-----C------C-
|-----ABC-----ABC <- zip
|-A-------A
|--B------B-
|-----C-----C-
|-----这是我在林帕德偶然发现的东西。它符合您对大理石图的要求。然而,这比我想要的更混乱
Nuget依赖于Rx测试
void Main()
{
TestScheduler scheduler = new TestScheduler();
/*
|--2A-------1A----------
|----1B----------2B-----
|------1C-----------2C--
|-----------1ABC----2ABC <- zipped by key 1 & 2 respectively
*/
var sourceA = scheduler.CreateColdObservable(
ReactiveTest.OnNext(3, "2A"),
ReactiveTest.OnNext(12, "1A"));
var sourceB = scheduler.CreateColdObservable(
ReactiveTest.OnNext(5, "1B"),
ReactiveTest.OnNext(17, "2B"));
var sourceC= scheduler.CreateColdObservable(
ReactiveTest.OnNext(7, "1C"),
ReactiveTest.OnNext(20, "2C"));
var observer = scheduler.CreateObserver<string>();
var query = Observable.Merge(sourceA, sourceB, sourceC)
.GroupBy(x => GetKey(x))
.SelectMany(grp => grp.Select(x=>GetValue(x))
.Take(3)
.Aggregate(new List<string>(),
(accumulator, current) => {
accumulator.Add(current);
return accumulator;
})
.Select(acc=>CreateGroupResult(grp.Key, acc)));
query.Subscribe(observer);
scheduler.Start();
ReactiveAssert.AreElementsEqual(
new[]{
ReactiveTest.OnNext(12, "1ABC"),
ReactiveTest.OnNext(20, "2ABC")
},
observer.Messages
);
}
// Define other methods and classes here
private static string CreateGroupResult(string key, IEnumerable<string> values)
{
var combinedOrderedValues = string.Join(string.Empty, values.OrderBy(v => v));
return string.Format("{0}{1}", key, combinedOrderedValues);
}
private static string GetKey(string message)
{
return message.Substring(0, 1);
}
private static string GetValue(string message)
{
return message.Substring(1);
}
void Main()
{
TestScheduler scheduler=新的TestScheduler();
/*
|--2A------1A----------
|----1B------2B-----
|------1C------2C--
|-----------1ABC---2ABC GetKey(x))
.SelectMany(grp=>grp.Select(x=>GetValue(x))
.采取(3)
.Aggregate(新列表(),
(累加器,电流)=>{
累加器。添加(当前);
回流蓄能器;
})
.选择(acc=>CreateGroupResult(grp.Key,acc));
查询、订阅(观察员);
scheduler.Start();
ReactiveAssert.AreElementsEqual(
新[]{
反应性测试.OnNext(12,“1ABC”),
ReactiveTest.OnNext(20,“2ABC”)
},
观察员:信息
);
}
//在此处定义其他方法和类
私有静态字符串CreateGroupResult(字符串键,IEnumerable值)
{
var combinedOrderedValues=string.Join(string.Empty,values.OrderBy(v=>v));
返回string.Format(“{0}{1}”,键,组合有序值);
}
私有静态字符串GetKey(字符串消息)
{
返回消息。子字符串(0,1);
}
私有静态字符串GetValue(字符串消息)
{
返回消息。子字符串(1);
}
void Main()
{
TestScheduler scheduler = new TestScheduler();
/*
|--2A-------1A----------
|----1B----------2B-----
|------1C-----------2C--
|-----------1ABC----2ABC <- zipped by key 1 & 2 respectively
*/
var sourceA = scheduler.CreateColdObservable(
ReactiveTest.OnNext(3, "2A"),
ReactiveTest.OnNext(12, "1A"));
var sourceB = scheduler.CreateColdObservable(
ReactiveTest.OnNext(5, "1B"),
ReactiveTest.OnNext(17, "2B"));
var sourceC= scheduler.CreateColdObservable(
ReactiveTest.OnNext(7, "1C"),
ReactiveTest.OnNext(20, "2C"));
var observer = scheduler.CreateObserver<string>();
var query = Observable.Merge(sourceA, sourceB, sourceC)
.GroupBy(x => GetKey(x))
.SelectMany(grp => grp.Select(x=>GetValue(x))
.Take(3)
.Aggregate(new List<string>(),
(accumulator, current) => {
accumulator.Add(current);
return accumulator;
})
.Select(acc=>CreateGroupResult(grp.Key, acc)));
query.Subscribe(observer);
scheduler.Start();
ReactiveAssert.AreElementsEqual(
new[]{
ReactiveTest.OnNext(12, "1ABC"),
ReactiveTest.OnNext(20, "2ABC")
},
observer.Messages
);
}
// Define other methods and classes here
private static string CreateGroupResult(string key, IEnumerable<string> values)
{
var combinedOrderedValues = string.Join(string.Empty, values.OrderBy(v => v));
return string.Format("{0}{1}", key, combinedOrderedValues);
}
private static string GetKey(string message)
{
return message.Substring(0, 1);
}
private static string GetValue(string message)
{
return message.Substring(1);
}