Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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通过在一个属性上连接来组合多个流_C#_System.reactive_Reactive Programming - Fatal编程技术网

C# 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--

我试图在Rx中“压缩”任意数量的流,其中元素对应,但可能被无序处理。每个流的元素都有一个标识符,可用于将它们匹配在一起。例如,元素看起来像:

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);
}