【发布时间】:2020-06-13 14:53:31
【问题描述】:
我有一个 IObservable boolObservable,发布者的行为就像 switch。还有带有一些值的变量 currentItem 和包含预定义不可变值的 defaultItem。每当发布 'true' 时,应记住 currentItem 的值,并且应将 currentItem 设置为 defaultItem。发布“false”时,currentItem 的值应更改为之前的值。 实现这一点的最简单方法是使用局部变量。
IObservable<bool> boolObservable;
string currentItem;
string defaultItem;
string local = null;
boolObservable.Subscribe(x =>
{
if (x) {
local = currentItem;
currentItem = defaultItem;
}
else
currentItem = local;
});
当我必须多次重复此操作并且每次都以不同的方式命名用于存储的局部变量时,问题就开始了。有没有办法使用 Rx 操作符来“记住”不仅是最新的有效载荷,而且是之前的有效载荷?
UPD:@ibebbs 下面的回答绝对正确,Scan 运算符提供了必要的行为:
var switchSource = new BehaviorSubject<bool>(false);
string currentItem = "FromDb";
string defaultItem = "Default";
switchSource
.Skip(1)
.Scan(string.Empty, (local, b) =>
{
if (b)
{
local = currentItem;
currentItem = defaultItem;
}
else
currentItem = local;
return local;
})
.Subscribe();
Console.WriteLine($"Initial value: {currentItem}"); // FromDb
switchSource.OnNext(true);
Console.WriteLine($"Default value: {currentItem}"); // Default
switchSource.OnNext(false);
Console.WriteLine($"Initial value again: {currentItem}"); // FromDb
currentItem = "UserChanged";
Console.WriteLine($"UserChanged value: {currentItem}"); // UserChanged
switchSource.OnNext(true);
Console.WriteLine($"Default value: {currentItem}"); // Default
switchSource.OnNext(false);
Console.WriteLine($"UserChanged value again: {currentItem}"); // UserChanged
【问题讨论】:
-
currentItem的值最初来自哪里?它也是一个可观察的来源吗?当“开关”设置为使用默认值时,currentItem应该如何更改(或不更改)?解决方案可能是一个简单的CombineLatest(),但很难说。请添加某种图表,说明应在何处/何时设置哪个值以及这些值如何随时间变化。 -
@Progman
currentItem最初来自数据库。当boolObservable的源 BehaviorSubject值设置为 false 时,用户也可以更改它。否则无法更改。它实际上被视为一个简单的可变属性,但也可以转换为 IObservable 。
标签: c# system.reactive