Функция преобразования в Rx - PullRequest
0 голосов
/ 01 апреля 2019

Я новичок в мире Rx, и мне трудно преобразовать приведенный ниже фрагмент кода в RX.

foreach (var filterGridStatusItem in FilterStatusItems)
{
    if (filterGridStatusItem.FilerValue.Equals(selectedItem.FilerValue))
    {
        if (!selectedItem.IsSelected)
        {
            filterGridStatusItem.IsSelected = true;
        }
        else
        {
            filterGridStatusItem.IsSelected = false;
        }
    }
}

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Вот Rx-версия вашего кода:

var query =
    from filterGridStatusItem in FilterStatusItems.ToObservable()
    where filterGridStatusItem.FilerValue.Equals(selectedItem.FilerValue)
    select new { filterGridStatusItem, selectedItem.IsSelected };

IDisposable subscription =
    query
        .Subscribe(x => x.filterGridStatusItem.IsSelected = !x.IsSelected);

Теперь, просто для сравнения, вот оптимизированная версия вашего кода:

foreach (var filterGridStatusItem in FilterStatusItems)
{
    if (filterGridStatusItem.FilerValue.Equals(selectedItem.FilerValue))
    {
        filterGridStatusItem.IsSelected = !selectedItem.IsSelected;
    }
}

А теперь версия LINQ:

var query =
    from filterGridStatusItem in FilterStatusItems
    where filterGridStatusItem.FilerValue.Equals(selectedItem.FilerValue)
    select new { filterGridStatusItem, selectedItem.IsSelected };

foreach (var x in query)
{
    x.filterGridStatusItem.IsSelected = !x.IsSelected;
}

В этом случае я чувствую, что оптимизированная версия вашего кода является лучшей - как с точки зрения ясности, так и производительности.

0 голосов
/ 02 апреля 2019

Как уже говорилось, Rx не подходит для этого сценария. В вашем случае существует ограниченный фиксированный набор элементов, которыми можно лучше управлять с помощью Linq, например, вот так:

foreach (var filterGridStatusItem in FilterStatusItems
                       .Where(fsi => fsi.FilerValue.Equals(selectedItem.FilerValue))
{
    filterGridStatusItem.IsSelected = !selectedItem.IsSelected
}
...