这个问题是基于类似名称的问题here,有两点不同:我可以通过匹配键配对两个可观测序列 - 使用重复键吗?
- 我匹配的多个密钥。没问题。
- 键可能重复。问题。
我的测试代码如下。我需要以下行为:
- 一个
CoordBundle
是只要至少一个CoordMetrics
和一个CoordData
观察公布。 - 如果某个特定的X/Y键在任何一个可观察对象上重复出现,则会发布一个新的CoordBundle。
我该做什么才能做到这一点?
public class CoordMetrics
{
internal CoordMetrics(int x, int y, IEnumerable<IMetric> metrics)
{
X = x;
Y = y;
Metrics = metrics;
}
internal int X { get; private set; }
internal int Y { get; private set; }
internal IEnumerable<IMetric> Metrics { get; private set; }
}
public class CoordData
{
internal CoordData(int x, int y, IEnumerable<IDatum> data)
{
X = x;
Y = y;
Data = data;
}
internal int X { get; private set; }
internal int Y { get; private set; }
internal IEnumerable<IDatum> Data { get; private set; }
}
public class CoordBundle
{
internal CoordBundle(int x, int y, IEnumerable<IMetric> metrics, IEnumerable<IDatum> data)
{
X = x;
Y = y;
Metrics = metrics;
Data = data;
}
internal int X { get; private set; }
internal int Y { get; private set; }
internal IEnumerable<IMetric> Metrics { get; private set; }
internal IEnumerable<IDatum> Data { get; private set; }
}
[TestClass]
public class PairingTest
{
[TestMethod, TestCategory("Temp")]
public void PairedObservableTest()
{
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
var aSource = new Subject<CoordMetrics>();
var bSource = new Subject<CoordData>();
var paired = Observable.Merge(aSource.Select(a => new Pair(a, null)), bSource.Select(b => new Pair(null, b)))
.GroupBy(p => p.Item1 != null ? new { p.Item1.X, p.Item1.Y } : new { p.Item2.X, p.Item2.Y })
.SelectMany(g => g.Buffer(2).Take(1))
.Select(g => new Pair(
g.ElementAt(0).Item1 ?? g.ElementAt(1).Item1,
g.ElementAt(0).Item2 ?? g.ElementAt(1).Item2))
.Select(t => new CoordBundle(t.Item1.X, t.Item1.Y, t.Item1.Metrics, t.Item2.Data));
paired.Subscribe(g => Trace.WriteLine(String.Format("{0},{1}", g.X, g.Y)));
bSource.OnNext(new CoordData(2, 1, Enumerable.Empty<IDatum>()));
aSource.OnNext(new CoordMetrics(2, 2, Enumerable.Empty<IMetric>()));
aSource.OnNext(new CoordMetrics(1, 1, Enumerable.Empty<IMetric>()));
bSource.OnNext(new CoordData(1, 2, Enumerable.Empty<IDatum>()));
bSource.OnNext(new CoordData(2, 2, Enumerable.Empty<IDatum>()));
bSource.OnNext(new CoordData(1, 1, Enumerable.Empty<IDatum>()));
aSource.OnNext(new CoordMetrics(1, 2, Enumerable.Empty<IMetric>()));
aSource.OnNext(new CoordMetrics(2, 1, Enumerable.Empty<IMetric>()));
aSource.OnNext(new CoordMetrics(2, 2, Enumerable.Empty<IMetric>()));
bSource.OnNext(new CoordData(2,2,Enumerable.Empty<IDatum>()));
}
}
所需的输出 - 只以上的输出码的前4行:
2,2
1,1
1,2
2,1
2,2
2,2
如果您创建了一个*最小*完整的可验证示例http://stackoverflow.com/help/mcve,将会非常有用。 “Pair”,“IMetric”和“IData”类型未定义。它似乎也不是你的例子实际需要的。最后,在你的测试中似乎没有断言,如果不是你的评论,你会将你的期望转移到一组断言上,这将是非常好的。 –
伟大的反馈,我会尽量让我的问题下一次更清洁一点。 – ket