2010-09-16 153 views
2

我不喜欢宽代码,特别是当它迫使我滚动。所以写了这个:缩短这个IF语句

If _item.SubItems(pd.perioddate).Text = "N/A" Or _item.SubItems(pd.perioddate).Text = String.Empty Then 
      dtpDeadlineforAP.Checked = False 
End If 

是否有一个体面的方式来减薄,使它更优雅?

回答

5

提取_item.SubItems(pd.perioddate).Text为局部变量,例如,

String text = _item.SubItems(pd.perioddate).Text 

If text = "N/A" Or text = String.Empty Then 
      dtpDeadlineforAP.Checked = False 
End If 

或者,你可能想整个支票提取到一个单独的方法:

If isNotFilled(_item.SubItems(pd.perioddate)) Then 
      dtpDeadlineforAP.Checked = False 
End If 

这将使代码的可读性更强,让你重用检查逻辑。

+0

我会重新命名文本变量意味着什么,朦胧periodDate = _item.SubItems(pd.perioddate)。文本 – Iain 2010-09-16 11:14:30

+0

我们还应该考虑选择案例,而不是引入一个局部变量? 'Select Case _item.SubItems(pd.perioddate).Text Case“N/A”,“”dtpDeadlineforAP.Checked = False End Select' – MarkJ 2010-09-16 11:29:51

+0

@Iain,同意了,我找不到一个好名字 - 正在考虑'findSomeMeaningfulNameForThis'一分钟:-) – 2010-09-16 11:54:15

1
string obj = _item.SubItems(pd.perioddate).Text; 

If obj = "N/A" Or obj = String.Empty Then 
      dtpDeadlineforAP.Checked = False 
End If 

ALSO

启用Word经在Visual Studio停止不必滚动。

转到

工具 - >选项 - >编辑 - 文本>所有语言 - >字经

不要忘记开启 '显示所有设置'

+0

OP的问题在Visual Basic中 - 您的答案的第一行是在C#中。 – Jazza 2010-09-16 10:42:44

+0

@Jazza:我认为VB用户能够(并且曾经)忽略一个';' – 2010-09-16 11:09:52

+1

@Jazza,@亨克是的,我们也可以在心理上将'string obj'改为'Dim obj As String' :) – MarkJ 2010-09-16 11:27:05

0
Dim date as String = _item.SubItems(pd.perioddate).Text 

If date = "N/A" Or date = String.Empty Then 
      dtpDeadlineforAP.Checked = False 
End If 
1
With _item.SubItems(pd.perioddate) 
    If .Text = "N/A" Or .Text = String.Empty Then 
     dtpDeadlineforAP.Checked = False 
    End If 
End With 

提示关于WITH的优点/弊端的论据:)

1

如果有多个字段可以包含N/A,我会uggest以下方法:

Dim invalidValues As String() = {"N/A", String.Empty} 

If invalidValues.Contains(_item.SubItems(pd.perioddate).Text) Then 
    dtpDeadlineforAP.Checked = False 
End If 

或者,如果它只是滚动,你可以使用VB续行符_

If _item.SubItems(pd.perioddate).Text = "N/A" _ 
Or _item.SubItems(pd.perioddate).Text = String.Empty Then 
    dtpDeadlineforAP.Checked = False 
End If 

BTW:在这里,我建议OrElse而不是Or

0

正如其他人所建议的那样,您可以使用局部变量。您还可以使用line continuation字符_另外缩短该行。

String period = _item.SubItems(pd.perioddate); 

If period = "N/A" Or _ 
    period = String.Empty Then 
     dtpDeadlineforAP.Checked = False 
End If 
0

我会suppgest一个助手类或ExtensionMethod:

If StringIsNullOrEmptyOrNA(stringval) Then 
    ... 
End If 


If stringval.IsNullOrEmptyOrNa() Then 
    .... 
End If 


Public Function StringIsNullOrEmptyOrNA(ByVal input as String) as Boolean 
    return String.IsNullOrEmpty(input) OrElse input.Equals("N/A") 
End Function 


<System.Runtime.CompilerServices.Extension()> 
Public Function IsNullOrEmptyOrNa(ByVal input As String) 
    return String.IsNullOrEmpty(input) OrElse input.Equals("N/A") 
End Sub 
+0

bear记住在VB.Net版本9.0(VS 2008)中引入了扩展方法。 OP没有提及他正在使用的VB.Net/VS的版本。 – Jazza 2010-09-16 10:46:14

+0

这就是为什么我首先在​​两种方式中添加了示例;) – 2010-09-16 13:57:35

1

我们至少应该提到Select Case

Select Case _item.SubItems(pd.perioddate).Text  
    Case "N/A", "" 
    dtpDeadlineforAP.Checked = False 
End Select 

也可以考虑提取辅助函数

Function IsNotApplicable(ByVal s As String) As Boolean 
    Return (s = "N/A") Or (s = "") 
End Function 
0

我得到它下降到3行和63列。我用新的If operator取代了传统的If construct。该代码还将处理Text作为空引用的情况,并将使用OrElse运算符进行短路。如果你愿意宣布一些扩展方法,你可以把它简化成一条短线,但这与我的答案的精神相冲突。

Dim tx = _item.SubItems(pd.perioddate).Text 
Dim dtp = dtpDeadlineforAP 
dtp.Checked = If(tx = "N/A" OrElse tx = "", False, dtp.Checked) 
+0

我认为我们仍然可以改进。 VB.Net将空引用字符串视为等于“”,因此整个第一行可以被删除。 – MarkJ 2010-09-16 19:49:31

+0

@MarkJ:直到现在,我还没有意识到这一点。感谢您指出了这一点! – 2010-09-16 19:59:18