减少 if 语句中的条件
本文关键字:条件 语句 if 减少 | 更新日期: 2023-09-27 18:32:29
我有一个if语句,用于在表单上的所有文本框完成后运行一些代码,
我检查所有文本框目前不为空的方式如下
if (txtUserId.Text != ""
&& txtFirstName.Text != ""
&& txtLastName.Text != ""
&& txtCity.Text != ""
&& txtSTate.Text != ""
&& txtCountry.Text != "")
{
// Some code
}
有没有更好的写法?
将检出抽象为一个函数:
bool IsFilled(TextBox tb) { return tb.Text != ""; }
然后,您可以使用旧的简化代码或此技巧:
var textBoxes = new [] { txtUserId, txtFirstName, ... };
if (textBoxes.All(tb => IsFilled(tb)) { ... }
您获得的文本框越多,这可能更具可扩展性。
您还可以编写由于方法组转换为委托而起作用的textBoxes.All(IsFilled)
。这稍微提高了性能,而且更短。不过,我发现方法组转换难以理解且具有误导性。其他人可能会问你"这是做什么的?"这表明代码气味。我不推荐它。
TextBox[] boxes = new[] { txtUserId, txtFirstName, txtLastName, txtCity, txtSTate, txtCountry };
if (boxes.All(x => x.Text != ""))
{
// Some code
}
您可以在窗体中循环访问TextBox
es。
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;
}
假设您使用的是 Windows 窗体控件,则可以编写以下内容:
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)
测试。
在这些
情况下,您还可以使用反射。当我使用多个字段按用户详细信息过滤结果时,我遇到了类似的问题。如果用户未在搜索框中键入任何内容,则查询将从数据库返回所有结果,这不是预期结果。我问了这个问题,第一次见面时陷入了沉思。
例如:
您有一个用户详细信息模型,如下所示
public class UserDetail{
public string FirstName {get;set;}
public string LastName {get;set;}
public string Country {get;set;}
}
然后,假设您有 userDetail 对象,并且您希望使用 LINQ 进行检查以确保 UserDetail 对象中的任何属性都不为 null 或为空。
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
}