Observable.Zip当zip到序列的数量在运行时之前是未知的

时间:2012-09-22 01:01:48

标签: c# system.reactive observable

我需要为审批流程建模。之前很简单。两个角色必须批准某些东西,然后我们可以继续下一步:

public class Approved
{
    public string ApproverRole;
}

var approvals = Subscribe<Approved>();

var vpOfFinance = approvals.Where(e => e.ApproverRole == "Finance VP");
var vpOfSales = approvals.Where(e => e.ApproverRole == "Sales VP");

var approvedByAll = vpOfFinance.Zip(vpOfSales, Tuple.Create);

approvedByAll.Subscribe(_ => SomeInterestingBusinessProcess());

但现在有一个新要求:批准某些内容所需的角色数量可能会有所不同:

public class ApprovalRequested
{
    public string[] Roles;
}
var approvalRequest = Subscribe<ApprovalRequested>().Take(1);
var approvals = Subscribe<Approved>();

var approvedByAll = ???;

approvedByAll.Subscribe(_ => SomeInterestingBusinessProcess());

我觉得我错过了一些非常明显的东西......有人能指出我正确的方向吗?

修改

澄清:批准过程基于每个项目。批准可以到达的顺序是不确定的。我们不关心一个角色是否多次批准某个项目。

1 个答案:

答案 0 :(得分:1)

在当前版本的Rx(我从NuGet获得)中,有一个Zip()版本,它接受一组observable并返回一个可观察的集合。有了这个,你可以这样做:

string[] requiredApprovals = …;

var approvedByAll = requiredApprovals
    .Select(required => approvals.Where(a => a.ApproverRole == required))
    .Zip();

approvedByAll.Subscribe(_ => SomeInterestingBusinessProcess());

但正如@Enigmativity指出的那样,只有当您确定每个人都以相同的顺序批准并且所有项目最终都将被所有必需的角色批准时,这才有效。如果没有,您将需要比Zip()更复杂的东西。