Оператор сканирования с селектором результатов

#c# #.net #system.reactive #reactive-streams #rx.net

Вопрос:

В Rx.NET, Aggregate имеет перегрузку , которая принимает a resultSelector , но Scan не делает этого. Есть ли для этого причина? И как бы я мог создать Scan оператор, который принимает селектор результатов, т. Е. с подписью: IObservablelt;TResultgt; Scanlt;TSource,TAccumulate,TResultgt;(this IObservablelt;TSourcegt; source, TAccumulate seed, Funclt;TAccumulate,TSource,TAccumulategt; accumulator, Funclt;TAccumulate,TResultgt; resultSelector) .

Ответ №1:

Достаточно ли тривиальной реализации ниже?

 public static IObservablelt;TResultgt; Scanlt;TSource, TAccumulate, TResultgt;(  this IObservablelt;TSourcegt; source,  TAccumulate seed,  Funclt;TAccumulate, TSource, TAccumulategt; accumulator,  Funclt;TAccumulate, TResultgt; resultSelector) {  return source.Scan(seed, accumulator).Select(resultSelector); }  

Комментарии:

1. Спасибо — да, я думаю, что это нормально. Кстати, тип моего накопления на самом деле является очередью, и в селекторе результатов я хотел бы удалить элементы из очереди. Считается ли это плохой практикой?

2. @jackdry ИМХО писать «побочный» код Rx нормально. Очевидно, что при этом код становится более хрупким и трудным в обслуживании, но иногда вам приходится это делать, потому что альтернативы просто хуже. Мое предложение, однако, состояло бы в том, чтобы сделать ваши намерения явными, используя оператора, предназначенного специально для введения побочных эффектов, а именно Do оператора, вместо того, чтобы скрывать побочные эффекты внутри, казалось бы, безобидных Select проекций.