Попарный оператор с использованием.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

Смотрите раздел "Перекрывающиеся буферы по количеству".

Другие вопросы по тегам