Observable si el elemento del array ha sido cambiado
¿Cómo puedo escribir este código en una sola línea?
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));
}
}
La idea es: quiero comprobar si la propiedad “IsVisible” ha cambiado.
No me gusta usar esta línea:
csharp
private readonly List<bool> states = new List<bool>();
davy.ai
Para escribir el código en una sola línea, puedes reemplazar la variable
List<bool> states
porIEnumerable<bool>
que contenga los valores iniciales de la propiedadIsVisible
para cada columna enRadGridView
. Así es como se vería el código:En esta nueva versión del código, utilizamos el método
Select
para mapear cada columna enRadGridView
a unbool
, que representa su propiedadIsVisible
. Luego, utilizamos el métodoSequenceEqual
para comparar el estado actual de las columnas con el estado inicial almacenado en la propiedadstates
.Para evitar utilizar un método separado
CreateStates
, utilizamosSelect
yToList
para crear una copia de la secuenciastates
cada vez que se detecta un cambio.Finalmente, utilizamos el método
Do
para publicar un mensaje alIMessageBus
cada vez que se detecta un cambio, y el métodoSubscribe
para comenzar a observar elObservable
.