2

2 つSubjectの があります。1 つは ID を持つ人物オブジェクトのストリームで、もう 1 つは誰が誰と友達になったかを表す ID の xref のストリームです。ここにいくつかの単純化されたコードがあります。

class Program {
    static void Main() {
        // Set up observables
        var people = new Subject<Person>();
        var friendMap = new Subject<FriendMap>();
        var friendNotices = from p1 in people
                            from p2 in people
                            from pair in friendMap
                            where p1.Id == pair.Id1 && p2.Id == pair.Id2
                            select p1.Name + " befriended " + p2.Name;

        // Subscribe to log
        friendNotices.Subscribe(Console.WriteLine);

        // Add people
        people.OnNext(new Person(1, "Alice"));
        people.OnNext(new Person(2, "Bob"));

        // Add relationships
        friendMap.OnNext(new FriendMap(1, 2)); // => "Alice befriended Bob"
        friendMap.OnNext(new FriendMap(2, 1)); // Doesn't show up!
    }
}

class Person {
    public Person(int id, string name) {
        Id = id;
        Name = name;
    }
    public string Name;
    public int Id;
}

class FriendMap {
    public FriendMap(int id1, int id2) {
        Id1 = id1;
        Id2 = id2;
    }
    public int Id1;
    public int Id2;
}

私が抱えている問題は、xref を追加してもイベントが発生しない場合があることですfriendNotice。特にId1の人物よりも先にId2の人物を作成すると失敗するようです。

これは Rx のバグですか、それとも私のコードのバグですか? いずれにせよ、これを機能させるにはどうすればよいですか?

(私のアプリケーションでは、「フレンドになる」ことは可換ではありません。アリスがボブとフレンドになることは、ボブがアリスとフレンドになることとは異なる関係であるため、「ID を交換して再試行するだけ」は、私の場合は使用可能なソリューションではありません)。

4

1 に答える 1