【问题标题】:Can this logic be simplified?这个逻辑可以简化吗?
【发布时间】:2014-08-21 13:18:44
【问题描述】:

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

看起来很重,有什么想法可以简化吗?

【问题讨论】:

    标签: c# logic isenabled isnullorempty


    【解决方案1】:

    是的。

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

    可以简化为

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

    【讨论】:

    • 这只是简化了每行的代码,你仍然需要为每个控件编写一个检查。
    【解决方案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
    

    【讨论】:

    • 这与问题中的代码不太一样:想象abd 已启用-然后ad 可能包含非空文本,而 b 可能为空,您的代码仍会将 ok 设置为 true,即使问题中的代码不允许启用的文本框为空。
    • 嗯,所以你想让我有更多的调用来实现新的变量? :p
    • @ORMapper 也许我误解了这个问题,但我阅读它们时的要求是两个组都必须有 至少 一个既启用又不为空的控件 -上面的代码给出了这一点。 Kilazur 我几乎不会称它为 更多 调用,它将所有控件移动到 可查询 数组中,如果您的数组增长,这将是 much更易于维护/更新。
    • 编辑了我的问题,我确实错过了一个标准。
    【解决方案3】:

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

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

    【讨论】:

    • 不应该是IsDisabledOrNotEmpty吗?
    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2011-03-11
    • 2013-07-13
    • 1970-01-01
    • 2011-01-26
    • 2021-06-23
    相关资源
    最近更新 更多