es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>();

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para escribir el código en una sola línea, puedes reemplazar la variable List<bool> states por IEnumerable<bool> que contenga los valores iniciales de la propiedad IsVisible para cada columna en RadGridView. Así es como se vería el código:

    public class RadGridColumnObservable
    {
        private readonly RadGridView grid;
        private readonly IMessageBus messageBus;
    
        private IEnumerable<bool> states => grid.Columns.Select(it => it.IsVisible);
    
        public RadGridColumnObservable(RadGridView grid, IMessageBus messageBus)
        {
            this.grid = grid;
            this.messageBus = messageBus;
        }
    
        public IDisposable Initialize()
        {
            return Observable
                .Interval(TimeSpan.FromSeconds(1))
                .Where(_ => states.SequenceEqual(grid.Columns.Select(it => it.IsVisible)) == false)
                .Select(_ => states.ToList())
                .Do(_ => messageBus.Publish(new NotifyMessage(MessageTypes.HistoryColumnsChanged)))
                .Subscribe();
        }
    }
    

    En esta nueva versión del código, utilizamos el método Select para mapear cada columna en RadGridView a un bool, que representa su propiedad IsVisible. Luego, utilizamos el método SequenceEqual para comparar el estado actual de las columnas con el estado inicial almacenado en la propiedad states.

    Para evitar utilizar un método separado CreateStates, utilizamos Select y ToList para crear una copia de la secuencia states cada vez que se detecta un cambio.

    Finalmente, utilizamos el método Do para publicar un mensaje al IMessageBus cada vez que se detecta un cambio, y el método Subscribe para comenzar a observar el Observable.

Comments are closed.