この質問は2つの違いで、同様の名称質問hereに基づいています。2つの観察可能なシーケンスを一致するキーでペアリングすることはできますか?
- を私は複数のキーを上に一致しています。問題ない。
- キーが繰り返されることがあります。問題。
私のテストコードは以下の通りです。
CoordBundle
が、すぐに観察された少なくとも1つのCoordMetrics
と1CoordData
として公開されている:私は、次の動作を必要としています。- 特定のX/Yキーがいずれかのobservableで繰り返されると、新しい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
* minimal *完全な検証可能な例http://stackoverflow.com/help/mcveを作成した場合は役立ちます。 'Pair'、' IMetric'、 'IData'の型は定義されていません。また、実際にあなたの例に必要とされていないようです。最後に、あなたのテストにアサーションがないように見えます。あなたのコメントの代わりに、期待をアサーションのセットに移したら、それは素晴らしいことでしょう。 –
偉大なフィードバック、私は質問を次回は少しきれいにしようとします。 – ket