2010-08-04 4 views
1

J'ai une chaîne qui a des permissions FTP - "LRSDCWAN" Existe-t-il un moyen plus efficace de vérifier le CheckBox pertinent si la chaîne contient le caractère approprié?Test d'une chaîne pour des caractères spécifiques VB.NET

 If reader.Item("home_perm").Contains("L") Then 
      CBoxList.Checked = True 
     End If 
     If reader.Item("home_perm").Contains("R") Then 
      CBoxRead.Checked = True 
     End If 
     If reader.Item("home_perm").Contains("S") Then 
      CBoxSubDir.Checked = True 
     End If 
     If reader.Item("home_perm").Contains("D") Then 
      CBoxDelete.Checked = True 
     End If 
     If reader.Item("home_perm").Contains("C") Then 
      CBoxCreate.Checked = True 
     End If 
     If reader.Item("home_perm").Contains("W") Then 
      CBoxWrite.Checked = True 
     End If 
     If reader.Item("home_perm").Contains("A") Then 
      CBoxAppend.Checked = True 
     End If 
     If reader.Item("home_perm").Contains("N") Then 
      CBoxRename.Checked = True 
     End If 

Merci.

Répondre

5

Bien qu'il ne se débarrasse pas de votre problème .Contains(), vous pouvez simplifier la logique un peu.

Si vous remarquez, vous utilisez:

If reader.Item("home_perm").Contains("L") Then 
    CBoxList.Checked = True 
End If 

Vous pouvez simplifier en disant simplement

CBoxList.Checked = reader.Item("home_perm").Contains("L") 

Vous pouvez le faire pour toutes vos cases à cocher. Il ne résout pas le besoin d'appeler contient, mais il élimine 2/3 de vos lignes de code.

+0

Grand peut-être ici ... si cela est approprié, ce sera également corrige un bug qui peut exister avec le code OP, en décochant les éléments qui ne sont pas dans la liste des permissions. Si, cependant, OP évite intentionnellement de décocher des éléments, cela causera un bug. – overslacked

0

Pourriez-vous mettre toutes vos valeurs de comparaison dans une liste générique et parcourir la liste?

2

EDIT .. Doh, j'ai raté le fait que c'est une case à cocher différente pour chaque personnage. OK, dans ce cas j'utiliserais un Dictionary(Of Char, CheckBox) pour chaque caractère. Quelque chose comme ceci - mais dans VB moins cassé :)

' Assumes VB10 collection initializers 
Dim map As New Dictionary(Of Char, CheckBox) From { 
    { "L", CBoxList }, 
    { "R", CBoxRead }, 
    { "S", CBoxSubDir }, 
    { "D", CBoxDelete }, 
    { "C", CBoxCreate } 
} 

For Each c As Char In reader.Item("home_perm") 
    Dim cb As CheckBox 
    If map.TryGetValue(c, cb) Then 
     cb.Checked = True 
    End If 
Next 
+1

Je pense que vous avez oublié qu'il y a une case à cocher séparée pour chaque valeur – kmfk

+0

Doh - n'a pas remarqué cela. Comme c'est ennuyeux. –

2

Expressions régulières.

http://msdn.microsoft.com/en-us/library/hs600312(VS.71).aspx

OU

méthode String.indexOf:

Dim myString As String = "LRSDCW" 
    Dim myInteger As Integer 
    myInteger = myString.IndexOf("D") // myInteger = 4 
    myInteger = myString.IndexOf("N") // myInteger = -1 

utiliser un tableau pour myInteger et vérifier chaque élément de la matrice pour une valeur différente de -1, si elle est - 1, ne cochez pas la case.

+0

Je ne pense pas que les expressions régulières vont vraiment aider ici ... –

+0

peut-être pas, c'est juste ma première pensée pour vérifier les chaînes, alternativement, vous pouvez vous la méthode string.indexof pour obtenir la position dans la chaîne d'une lettre, il donnera -1 s'il ne se termine pas, ce n'est pas élégant, mais cela fonctionnera – MaQleod

+0

MaQleod: Je ne pense pas que la vérification du confinement d'un seul caractère soit un problème ici; Contient fonctionne bien. Le problème est la répétition. Je ne vois pas comment utiliser les expressions régulières * ou * IndexOf aide là-bas. –

0
CBoxRename.Checked = (New Regex("[LRSDCWAN]").Match(reader.Item("home_perm")).Count > 0) ? 

C'est assez inefficace - c'est une marque nouvelle instance d'une classe relativement intensive à chaque fois, de sorte que vous pouvez mettre en cache un et le réutiliser si vous voulez, mais cette façon, il s'inscrit parfaitement dans une ligne.

+0

Malédictions. Fait la même erreur que le légendaire Jon Skeet; donc je ne me sens pas trop mal. Vous pouvez concaténer la même logique que vous avez utilisée dans le formulaire Checkbox.Checked = reader.Item ("home_perm"). Contient ("L") –

Questions connexes