回答編集履歴

1

WithLatestFromオペレータが使えると思います。

2016/05/14 08:58

投稿

Temarin
Temarin

スコア14

test CHANGED
@@ -1,10 +1,18 @@
1
- 単純にSampleオペレータを使うと良いかと思い
1
+ 【回答編集しした
2
2
 
3
3
 
4
4
 
5
- ```ここに言語入力
5
+ 最新の値ペアで取得する場合は、WithLatestFromオペレータを使うと良いと思います。
6
6
 
7
+
8
+
9
+
10
+
11
+
12
+
13
+ ```c#
14
+
7
- // 何かのセンサーのつもり (1秒毎に値が発生する何か)
15
+ var r = new Random();
8
16
 
9
17
  var sensor = Observable.Interval( TimeSpan.FromSeconds( 1 ) )
10
18
 
@@ -14,11 +22,17 @@
14
22
 
15
23
  Id = x ,
16
24
 
17
- Timestamp = DateTime.Now
25
+ Timestamp = DateTime.Now ,
26
+
27
+ Key = r.Next() % 2 == 0 ? 'A' : 'B'
18
28
 
19
29
  } )
20
30
 
21
- .Do( x => Console.WriteLine( $"sensor:{x.Id} - {x.Timestamp}" ) );
31
+ .Do( x => Console.WriteLine( $"DEBUG {x.Key}-{x.Id}->{x.Timestamp}" ) )
32
+
33
+ .Publish()
34
+
35
+ .RefCount();
22
36
 
23
37
 
24
38
 
@@ -26,13 +40,33 @@
26
40
 
27
41
  sensor
28
42
 
29
- .Sample( TimeSpan.FromSeconds( 3 ) ) // 3秒毎に最新の値を後続に流す
43
+ .Where( x => x.Key == 'A' )
30
44
 
45
+ .WithLatestFrom(
46
+
47
+ sensor.Where( x => x.Key == 'B' ) ,
48
+
49
+ ( a , b ) => new
50
+
51
+ {
52
+
53
+ A = a ,
54
+
55
+ B = b
56
+
57
+ }
58
+
59
+ )
60
+
61
+ .Sample( TimeSpan.FromSeconds( 3 ) )
62
+
31
- .Subscribe( x => Console.WriteLine( $"event:{x.Id} - {x.Timestamp} " ) );
63
+ .Subscribe( x => Console.WriteLine( $"{x.A.Key}:ID={x.A.Id}->{x.A.Timestamp} {x.B.Key}:{x.B.Id}->{x.B.Timestamp}" ) );
32
64
 
33
65
  ```
34
66
 
35
67
 
68
+
69
+ WithLatestFromオペレータは、それぞれのシーケンスの最新の値を合成します。
36
70
 
37
71
  Sampleオペレータは、値をサンプリングし続け、一定間隔毎に最新の値を後続に流すオペレータです。
38
72
 
@@ -40,30 +74,34 @@
40
74
 
41
75
 
42
76
 
77
+ //--- 実行結果 ---//
78
+
79
+ DEBUG B-2->2016/05/14 17:47:18
80
+
81
+ DEBUG B-3->2016/05/14 17:47:19
82
+
83
+ DEBUG A-4->2016/05/14 17:47:20
84
+
85
+ DEBUG B-5->2016/05/14 17:47:21
86
+
87
+ A:ID=4->2016/05/14 17:47:20 B:3->2016/05/14 17:47:19
88
+
89
+ DEBUG A-6->2016/05/14 17:47:22
90
+
91
+ DEBUG B-7->2016/05/14 17:47:23
92
+
93
+ DEBUG A-8->2016/05/14 17:47:24
94
+
95
+ A:ID=6->2016/05/14 17:47:22 B:5->2016/05/14 17:47:21
96
+
97
+ DEBUG B-9->2016/05/14 17:47:25
98
+
99
+ DEBUG B-10->2016/05/14 17:47:26
100
+
101
+ A:ID=8->2016/05/14 17:47:24 B:7->2016/05/14 17:47:23
102
+
103
+ DEBUG A-11->2016/05/14 17:47:27
43
104
 
44
105
 
45
- sensor:0 - 2016/05/13 21:41:22
46
106
 
47
- sensor:1 - 2016/05/13 21:41:23
48
107
 
49
- sensor:2 - 2016/05/13 21:41:24
50
-
51
- event:2 - 2016/05/13 21:41:24
52
-
53
- sensor:3 - 2016/05/13 21:41:25
54
-
55
- sensor:4 - 2016/05/13 21:41:26
56
-
57
- event:4 - 2016/05/13 21:41:26
58
-
59
- sensor:5 - 2016/05/13 21:41:27
60
-
61
- sensor:6 - 2016/05/13 21:41:28
62
-
63
- sensor:7 - 2016/05/13 21:41:29
64
-
65
- sensor:8 - 2016/05/13 21:41:30
66
-
67
- event:7 - 2016/05/13 21:41:29
68
-
69
- sensor:9 - 2016/05/13 21:41:31