2017-04-05 2 views
2

Avez-vous une idée pour éviter de faire plusieurs String.Equals? Par exemple:C# - Compare une chaîne de variables à plusieurs autres chaînes (String.Equals)

if (interSubDir.Equals("de") || interSubDir.Equals("de-DE")) 

Merci!

+1

Vous pouvez créer une collection de littéraux de chaîne et vérifier si cette collection contient 'interSubDir'. – David

+1

Vous devrez faire la comparaison pour chaque cible à un moment donné, que ce soit en boucle ou individuellement. Essayez-vous simplement de le rendre plus lisible? –

+0

En règle générale, lorsque vous vérifiez si X est égal à A, B, C, D, etc., vous devez vérifier chacun d'eux. Il n'y a pas de véritable raccourci. Parfois, vous pouvez regrouper les choses dans un tableau et effectuer votre vérification en utilisant 'Any', mais si ce que vous faites dépend de ce que vous vérifiez, cela ne vous aidera pas. – Will

Répondre

2

Créer collection de valeurs:

string[] values = { "de", "de-DE" }; 

Utilisez la méthode Contains:

if (values.Contains(interSubDir)) 

Il donne la performance de O (n).

Si votre collection est très grande, vous pouvez utiliser la méthode Array.BinarySearch, qui vous donne des performances O (log n).

if (Array.BinarySearch(values, interSubDir) >= 0) 

Cependant, la collection doit être triée en premier.

Array.Sort(values); 
0

Linq pourrait vous aider. listToChechAgainst peut être une variable simple ou une propriété privée/publique.

var listToChechAgainst = new[] { "de", "DE-de" }; 

if(listToChechAgainst.Any(x => innerSubDir.Equals(x))); 
3

Si vous essayez simplement de le rendre plus lisible, ou exiger moins de frappe, vous pouvez écrire une méthode d'extension de chaîne comme ceci:

public static class StringExt 
{ 
    public static bool EqualsAnyOf(this string value, params string[] targets) 
    { 
     return targets.Any(target => target.Equals(value)); 
    } 
} 

que vous pouvez utiliser comme suit:

if (interSubDir.EqualsAnyOf("de", "de-DE")) 

Ou

if (interSubDir.EqualsAnyOf("de", "de-DE", "en", "en-GB", "en-US")) 

et ainsi de suite.