将函数转换为Rx

问题描述 投票:0回答:2

我是Rx世界的新手,我发现很难将下面的代码转换成RX。

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

任何帮助将不胜感激。

c# system.reactive
2个回答
0
投票

如上所述,Rx不适合这种情况。在您的情况下,有一组有限的,固定的项目可以使用Linq更好地管理,例如:

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

0
投票

这是您的代码的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;
}

在这种情况下,我觉得代码的优化版本是最好的 - 无论是在清晰度还是性能方面。

© www.soinside.com 2019 - 2024. All rights reserved.