2

我有两组控件。

第一个包含 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)))
    )
);

它的眼睛很重,关于如何简化它的任何想法?

4

3 回答 3

3

是的。

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

可以简化为

!a.IsEnabled || !String.IsNullOrWhiteSpace(a.Text)
于 2014-08-21T13:22:31.260 回答
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
于 2014-08-21T13:22:49.057 回答
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();
于 2014-08-21T13:27:32.860 回答