gpt4 book ai didi

c# - 如果数组元素发生变化则可观察

转载 作者:行者123 更新时间:2023-12-05 05:51:20 25 4
gpt4 key购买 nike

如何用一行代码编写这段代码?

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<bool> states = new List<bool>();

最佳答案

你可以用这样的东西得到你的 IsVisible 值:

private IObservable<List<bool>> CreateStatesObservable()
{
return Observable.Interval(TimeSpan.FromSeconds(1))
.Select(_ => grid.Columns.Select(it => it.IsVisible));
}

然后使用Scan跟踪您以前的值(value):

public void Initialize()
{
var observable =
CreateStatesObservable()
.Scan(
(prev: default(List<bool>), actual: default(List<bool>)),
(acc, c) => (acc.actual, 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);
}

这两个选项都应为您提供一个可观察对象,该对象仅在 IsVisible 列之一发生更改时才产生值。 (该值只是一个 true)

编辑:

您还可以将 DistinctUntilChanged() 与您自己的 IEqualityComparer 一起使用,如下所示:

class ListComparer : IEqualityComparer<List<bool>>
{
bool IEqualityComparer<List<bool>>.Equals(List<bool>? a, List<bool>? b)
{
if (a is null && b is null)
{
return true;
}

if (a is null || b is null)
{
return false;
}

return a.SequenceEqual(b);
}

int IEqualityComparer<List<bool>>.GetHashCode(List<bool> obj)
{
return obj.GetHashCode();
}
}

然后像这样使用它:

public void Initialize()
{
var observable =
CreateStatesObservable()
.DistinctUntilChanged(new ListComparer())
.Select(_ => true);
}

关于c# - 如果数组元素发生变化则可观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70393174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com