我如何用一行撰寫此代碼?
public class RadGridColumnObservable
{
public RadGridColumnObservable(RadGridView grid, IMessageBus messageBus)
{
this.grid = grid;
this.messageBus = messageBus;
}
public IDisposable Initialize()
{
CreateStates();
return Observable
.Interval(TimeSpan.FromSeconds(1))
.Subscribe(_ => CheckUp());
}
//
private readonly RadGridView grid;
private readonly IMessageBus messageBus;
private readonly List<bool> states = new List<bool>();
//
private void CreateStates()
{
states.Clear();
states.AddRange(grid.Columns.Select(it => it.IsVisible));
}
private void CheckUp()
{
if (states.SequenceEqual(grid.Columns.Select(it => it.IsVisible))) return;
CreateStates();
messageBus.Publish(new NotifyMessage(MessageTypes.HistoryColumnsChanged));
}
}
想法是:我想檢查“IsVisible”屬性是否已更改。
我不喜歡使用這一行: private readonly List states = new List();
uj5u.com熱心網友回復:
你可以IsVisible用這樣的東西來獲得你的價值:
private IObservable<List<bool>> CreateStatesObservable()
{
return Observable.Interval(TimeSpan.FromSeconds(1))
.Select(_ => grid.Columns.Select(it => it.IsVisible));
}
然后使用Scan來跟蹤您之前的值:
public void Initialize()
{
var observable =
CreateStatesObservable()
.Scan(
(prev: default(List<bool>), actual: default(List<bool>)),
(acc, c) => (acc.current, current))
.Where(values => !values.actual.SequenceEqual(values.prev))
.Select(_ => true);
}
或者您可以使用Defer并執行以下操作:
public void Initialize2()
{
var observable = CreateStatesObservable();
var deferred =
Observable.Defer(
() =>
{
List<bool> previous = null;
return observable.Select(
values =>
{
if (previous is null)
{
previous = values;
return false;
}
if (!values.SequenceEqual(previous))
{
previous = values;
return true;
}
return false;
});
})
.Where(value => value);
}
這兩個選項都應該為您提供一個 observable,它僅在其中一列IsVisible發生更改時產生一個值。(該值只是一個true)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/383685.html
