我是Rx世界的新手,我发现很难将下面的代码转换成RX。
foreach (var filterGridStatusItem in FilterStatusItems)
{
if (filterGridStatusItem.FilerValue.Equals(selectedItem.FilerValue))
{
if (!selectedItem.IsSelected)
{
filterGridStatusItem.IsSelected = true;
}
else
{
filterGridStatusItem.IsSelected = false;
}
}
}
任何帮助将不胜感激。
如上所述,Rx不适合这种情况。在您的情况下,有一组有限的,固定的项目可以使用Linq更好地管理,例如:
foreach (var filterGridStatusItem in FilterStatusItems
.Where(fsi => fsi.FilerValue.Equals(selectedItem.FilerValue))
{
filterGridStatusItem.IsSelected = !selectedItem.IsSelected
}
这是您的代码的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;
}
在这种情况下,我觉得代码的优化版本是最好的 - 无论是在清晰度还是性能方面。