if语句中的条件简化

3

我有一个if语句,当表单上的所有文本框都被填写时运行一些代码。

目前我检查所有文本框是否为空的方法如下:

if (txtUserId.Text != ""
                    && txtFirstName.Text != ""
                    && txtLastName.Text != ""
                    && txtCity.Text != ""
                    && txtSTate.Text != ""
                    && txtCountry.Text != "")
                {
                    // Some code
                }

有更好的写法吗?


你使用什么?WPF 还是 Forms? - Naren
string.IsNullOrEmpty - Arran
定义“更好”。代码是否清晰,现在是否能够正常工作?我认为这两个问题的答案都是“是”,你不需要对此做出任何改变。(除非你计划大幅增加字段数量。) - Omaha
附注:作为Java的使用者,我不会使用“!=”来比较字符串,而是使用Equals()方法。不确定在C#中是否适用。 - FallenSquirrel
@FallenSquirrel 在.NET中,通常使用string.IsNullOrEmpty()string.IsNullOrWhiteSpace() - Jehof
2
@FallenSquirrel .NET 为字符串定义了重载运算符 ==,用于值比较。 - usr
5个回答

10

将结账过程封装成一个函数:

bool IsFilled(TextBox tb) { return tb.Text != ""; }

你可以使用旧的简化代码,或者使用这个技巧:

var textBoxes = new [] { txtUserId, txtFirstName, ... };
if (textBoxes.All(tb => IsFilled(tb)) { ... }

当你有更多文本框时,这可能更具可扩展性。

您也可以编写textBoxes.All(IsFilled),这是由于将方法组转换为委托而起作用的。这样做略微更有效率,且更短。我发现方法组转换难以理解且易误导。其他人可能会问您“那是什么?” 这表明存在代码漏洞。我不建议这样做。


好的,我也去掉了双重否定。反正我对那个不是很满意。现在问题是IsFilled是否在这里真的有必要,但我想也许在将来检查会变得更加复杂(例如测试空格等)。我们不想重复所有这些工作。 - usr
现在你可以将 textBoxes.All(tb => IsFilled(tb)) 简化为 textBoxes.All(IsFilled) - Henrik
我故意不这样做,因为我觉得方法组转换很难理解且容易误导。我想这是我的个人特点吧。 - usr

3
TextBox[] boxes = new[] { txtUserId, txtFirstName, txtLastName, txtCity, txtSTate, txtCountry };

if (boxes.All(x => x.Text != ""))
{
    // Some code
}

0

在这些情况下,您也可以使用反射。当我通过多个字段的用户详细信息过滤结果时,遇到了类似的问题。如果用户在搜索框中没有输入任何内容,则查询将从数据库返回所有结果,这不是预期的结果。我曾经问过这个问题,并第一次遇到了反射。

例如:

您有一个如下所示的UserDetail模型

public class UserDetail{

  public string FirstName {get;set;}

  public string LastName {get;set;}

  public string Country {get;set;}
}

假设您有userDetail对象,并且想要使用LINQ检查UserDetail对象中的属性是否为空或空字符串。

return userDetail.GetType().GetProperties()
    .Where(pi => pi.GetValue(userDetail) is string)
    .Select(pi => (string) pi.GetValue(userDetail))
    .All(value => !String.IsNullOrEmpty(value));

如果userDetail对象的所有字符串属性都不为null或空,则此方法将返回true。如果所有属性都包含内容,则输出true。

你的逻辑应该是:

public bool AllUserDetailsContainSomething(UserDetail userDetail){

 return userDetail.GetType().GetProperties()
        .Where(pi => pi.GetValue(userDetail) is string)
        .Select(pi => (string) pi.GetValue(userDetail))
        .All(value => !String.IsNullOrEmpty(value));

} 

然后你可以调用这个方法

if(AllUserDetailsContainSomething(userDetail)){
 //do something
}

0
你可以在表单中循环遍历TextBox
private bool AreThereAnyEmptyTextBoxes()
{
    foreach (var item in this.Controls)
    {
        if (item is TextBox)
        {
            var textBox = (TextBox)item;
            if (textBox.Text == string.Empty)
            {
                return true;
            }
        }
    }

    return false;
}

0
假设您正在使用Windows Forms控件,您可以编写以下代码:
public bool AllTextEntered(params Control[] controls)
{
    return controls.All(control => (control != null) && (control.Text != ""));
}

之后你可以像这样调用它:

if (AllTextEntered(txtUserId, txtFirstName, txtLastName, txtCity, txtSTate, txtCountry))
{
    // ...
}

使用params的优点是允许您传递尽可能多的控件,而无需手动编写代码将它们全部放入数组中,然后将其传递给AllTextEntered()

另外请注意,(control != null)测试可能并不真正需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接