这个逻辑可以简化吗?

时间:2014-08-21 13:18:44

标签: c# logic isenabled isnullorempty

我有两组控件。

第一个包含3个名为a,b和c的文本框。它们都可以同时启用或禁用。

第二组包含2个文本框(d和e)。一次启用一个且唯一一个。

现在,我有一个布尔变量(名为ok),如果符合以下情况,则为真:

  • 启用a,b和c中的至少一个并包含文本
  • 启用的第二组文本框包含文字
  • 无法在不包含文字的情况下启用

我想在一次通话中查看全部

这是我得到的:

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

它的眼睛很重,有关如何简化它的想法吗?

3 个答案:

答案 0 :(得分:3)

!a.IsEnabled || (a.IsEnabled && !String.IsNullOrWhiteSpace(a.Text))

可以简化为

!a.IsEnabled || !String.IsNullOrWhiteSpace(a.Text)

答案 1 :(得分:2)

为什么不将所有控件都放在列表中,使用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

答案 2 :(得分:2)

您可以通过添加辅助扩展方法来简化逻辑处理:

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