我有两个Subject
s,一个是带有 ID 的人员对象流,另一个是代表谁与谁交朋友的 ID 的外部参照流。这是一些简化的代码。
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;
}
我遇到的问题是有时添加外部参照不会导致friendNotice
事件。特别是,如果 Id2 的人是在Id1 的人之前创建的,它似乎会失败。
这是 Rx 中的错误还是我的代码中的错误?无论哪种方式,我该如何让它发挥作用?
(“交友”在我的应用程序中是不可交换的——爱丽丝与鲍勃交朋友与鲍勃与爱丽丝交朋友的关系不同,因此“只需交换 ID 并重试”在我的情况下不是一个可用的解决方案)。