这个逻辑可以简化吗?
本文关键字: | 更新日期: 2023-09-27 18:18:55
我有两组控件
第一个包含三个文本框,分别命名为a, b和c,它们可以同时启用或禁用。
第二组包含两个文本框(d和e),一次只能启用一个。
现在,我有一个布尔变量(名为ok),如果:
- a,b和c中至少有一个是启用的并且包含文本
- 启用的第二组的文本框包含文本
- None可以在不包含文本 的情况下启用
我想在一次调用中检查它。
结果如下:
bool ok =
(
(
(
(!a.IsEnabled ||
(a.IsEnabled && !String.IsNullOrWhiteSpace(a.Text))) &&
(!b.IsEnabled ||
(b.IsEnabled && !String.IsNullOrWhiteSpace(b.Text))) &&
(!c.IsEnabled ||
(c.IsEnabled && !String.IsNullOrWhiteSpace(c.Text))) &&
(a.IsEnabled || b.IsEnabled || c.IsEnabled)
)
) &&
(
(!d.IsEnabled ||
(d.IsEnabled && !String.IsNullOrWhiteSpace(d.Text))) &&
(!f.IsEnabled ||
(f.IsEnabled && !String.IsNullOrWhiteSpace(f.Text)))
)
);
它很重的眼睛,有什么办法简化它吗?
可以。
!a.IsEnabled || (a.IsEnabled && !String.IsNullOrWhiteSpace(a.Text))
可以简化为
!a.IsEnabled || !String.IsNullOrWhiteSpace(a.Text)
为什么不把所有控件放到一个列表中,然后使用LINQ查询它们呢
var group1 = new[] { a, b, c };
var group2 = new[] { d, e };
var all = group1.Concat(group2);
// assuming all controls are the same or implement the same interface
Func<ControlType, bool> enabledAndNotEmpty = (x) => {
return x.IsEnabled && !String.IsNullOrWhiteSpace(x.Text);
};
Func<ControlType, bool> enabledAndEmpty = (x) => {
return x.IsEnabled && String.IsNullOrWhiteSpace(x.Text);
};
var ok = group1.Any(enabledAndNotEmpty) && // a, b or c is enabled & not empty
group2.Any(enabledAndNotEmpty) && // d or e is enabled & not empty
!all.Any(enabledAndEmpty); // none of the above are enabled & empty
您可以通过添加helper扩展方法来简化逻辑处理:
private static bool IsDisabledOrNotEmpty(this TextBox tb) {
return !tb.IsEnabled || !String.IsNullOrWhiteSpace(tb.Text);
}
现在你可以重写你的逻辑如下:
bool ok =
a.IsDisabledOrNotEmpty()
&& b.IsDisabledOrNotEmpty()
&& c.IsDisabledOrNotEmpty()
&& (a.IsEnabled || b.IsEnabled || c.IsEnabled)
&& d.IsDisabledOrNotEmpty()
&& f.IsDisabledOrNotEmpty();