2017-04-22 4 views
1

정렬 된 순서의 이벤트 스트림이 있습니다. 각 이벤트는 키 속성 (ID)을 가진 그룹의 일부입니다. 이벤트는 비 ID 속성에 대해 다른 값을가집니다. ID가 변경되기 전에 최종 이벤트를 제외하고 모두 무시하고 싶습니다. 스트림이 완료 될 때까지 기다릴 것, 나는 지금까지 내가 이해, GroupBy ID와 다음 TakeLast(1) 그러나 TakeLast을 사용했다순서대로 마지막으로 일치하는 요소 만 어떻게 방출합니까?

{ID:1, Prop:"V3"},{ID:2, Prop:"V25"},{ID:3, Prop:"V8"} 

과에 대한 가능성이 보일 것입니다 : 예

{ID:1, Prop: "V1"}, {ID:1, Prop:"V2"}, {ID:1, Prop:"V3"}, {ID:2, Prop:"V1"}, {ID:2, Prop:"V2"}, {ID:2, Prop:"V3"}, {ID:2, Prop:"V25"}, {ID:3, Prop:"V1"}, {ID:3, Prop:"V8"} 

들어 난 단지 방출 할 것 오래 동안 더 많은 메모리를 가져라. 스트림에서 다른 ID를 확인하자 마자 ID 시퀀스의 마지막 부분을 보았습니다. 따라서 키 속성이 변경되는 즉시 값을 내 보내려합니다. 나는 distinctUntilChange과 같은 것 같지만 나에게 마지막 값을 준다.

스트림에서 ID:2의 첫 번째 요소를 확인하자마자 첫 번째 요소를 방출 할 것으로 예상됩니다.

나는 버퍼링이나 무언가에 대해 생각했지만 여전히 반응이 머리 주위에 들었습니다. 어떤 아이디어?

답변

2
source.Buffer(2, 1) 
     .Where(i => i.Count == 2 ? (i[0].ID != i[1].ID) : true) 
     .Select(i => i[0]) 

Observable의 최신 요소 2 개를 실행중인 버퍼로 유지하십시오. ID가 변경되거나 버퍼에 하나의 요소 (마지막 요소) 만 들어 있으면 버퍼의 첫 번째 항목을 내 보냅니다.

+1

버퍼링과 관련 있다고 생각했습니다. 어쩌면 나는 아직 시내에서 숙달을 달성 할 것입니다! – GraemeMiller