Попарный оператор с использованием.buffer в rx.net
Мне нужно автоматически выполнять резервное копирование моих файлов с внешних драйверов (например, USB-ключей). Когда драйвер подключен. Чтобы узнать, когда новый USB или жесткий диск вставлен, я использовал наблюдаемый, проблема в том, что единственный способ, которым я знаю о подключить драйверы можно с помощью функции:
DriveInfo.GetDrives();
возвращает список, содержащий каждый связанный драйвер: и я реализую эту функцию, чтобы узнать, когда подключена новая массовая память:
public static IObservable<DriveInfo> ObserveNewDrivers() =>
Observable.Interval(TimeSpan.FromSeconds(5))
.Select(_ => DriveInfo
.GetDrives())
.DistinctUntilChanged()
.Buffer(2)
.SelectMany(buff => buff.Aggregate(
(a, b) => b.Except(a).ToArray()));
это не работает, потому что я сравниваю только пару двух-двух драйверов (используя функцию "Кроме") числовой пример: 1,2; 3.4; 5,6;, Таким образом, если я вставлю один и тот же драйвер, я сделаю двойное резервное копирование дважды, потому что я не сравниваю 3-й драйвер с первым (например).
Я думаю, что мне нужно поведение парного оператора в rxjs, но не в.net, т.е.: 1.2; 2,3; 3.4; 4.5; 5,6; так далее
пс. извините, если я не был слишком ясен и для моего плохого английского языка:^)
спасибо за любые ответы
1 ответ
Буфер в.NET имеет конструктор с 2 аргументами, который позволяет вам делать "перекрывающийся" буфер.
Если мое понимание проблемы, с которой вы сталкиваетесь, правильное, вы можете использовать:
.Buffer(2, 1)
Это означает, что два значения будут передаваться на каждое 1 новое значение. Больше информации здесь:
http://www.introtorx.com/Content/v1.0.10621.0/13_TimeShiftedSequences.html
Смотрите раздел "Перекрывающиеся буферы по количеству".