2010-09-16 6 views
2

Je n'aime pas le code large, surtout quand il me force à faire défiler. Donc, ayant écrit ceci:Raccourcir cette instruction IF

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

Existe-t-il un moyen décent de l'alléger, de le rendre plus élégant?

Répondre

5

Extrayez _item.SubItems(pd.perioddate).Text dans une variable locale, par ex.

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

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

Alternativement, vous pouvez extraire l'ensemble vérification dans une méthode distincte:

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

Cela rendrait le code plus lisible et vous permettent de réutiliser la logique de contrôle.

+0

Je renommer la variable de texte pour signifier quelque chose, dim periodDate = _item.SubItems (pd.perioddate) .Text – Iain

+0

Nous devrions également envisager Select Case plutôt que d'introduire une variable locale? 'Case Select _item.SubItems (pd.perioddate) .Text Case" N/A "," "dtpDeadlineforAP.Checked = Faux Fin Sélectionnez ' – MarkJ

+0

@Iain, d'accord, je ne pouvais pas trouver un bon nom - envisageait' findSomeMeaningfulNameForThis' pour une minute :-) –

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

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

AUSSI

permettent Chaîne de mots en studio visuel pour cesser d'avoir à faire défiler.

aller à

Outils-> Options-> Texte Editor-> Toutes langues-> Mot chaîne

Ne pas oublier d'activer "Afficher tous les paramètres de

+0

La question de l'OP est en Visual Basic - la première ligne de votre réponse est en C#. – Jazza

+0

@Jazza: Je pense que les utilisateurs de VB sont capables (et habitués) d'ignorer un ';' –

+1

@Jazza, @Henk Oui, et nous pouvons aussi changer mentalement 'string obj' en' Dim obj As String' :) – MarkJ

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 

de Cue argument concernant les mérites/maux de WITH :)

1

S'il y a plusieurs champs qui peuvent contenir N/A, je serais uggest l'approche suivante:

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

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

Ou, si elle est à peu près le défilement, vous pouvez utiliser la ligne VB caractère de continuation _:

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

BTW: Ici, je vous suggère OrElse au lieu de Or.

0

Comme d'autres l'ont suggéré, vous pouvez utiliser une variable locale. Vous pouvez également raccourcir la ligne en utilisant le caractère line continuation_.

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

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

Je suppgest une classe d'assistance ou 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 en gardant à l'esprit que les méthodes d'extension ont été introduites avec VB.Net version 9.0 (VS 2008). L'OP ne mentionne pas la version de VB.Net/VS qu'il utilise. – Jazza

+0

C'est pourquoi j'ai ajouté des exemples pour les deux façons en premier lieu;) –

1

Il faut au moins mentionner Select Case

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

Voir également l'extraction d'une fonction d'aide

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

I eu jusqu'à 3 lignes et 63 colonnes. J'ai remplacé le traditionnel If construct par le plus récent If operator. Le code traitera également le cas de Text étant une référence nulle et court-circuera en utilisant l'opérateur OrElse.Si vous êtes prêt à déclarer quelques méthodes d'extension, vous pouvez réduire cela à une ligne courte, mais cela va à l'encontre de l'esprit de ma réponse.

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

Je pense que nous pouvons encore améliorer. VB.Net traite une chaîne de référence nulle comme égale à "", de sorte que toute la première ligne peut être supprimée. – MarkJ

+0

@MarkJ: Je n'étais pas au courant de ça ... jusqu'à maintenant. Merci d'avoir fait remarquer cela! –