2017-10-15 6 views
3

donc actuellement je fais ceci:C# - Y a-t-il un moyen de vérifier si une variable est une de plusieurs choses?

if(variable == thing1 || variable == thing2 || variable == thing3) 

Mais ce n'est pas super lisible. Ce que je voudrais faire est quelque chose comme ceci:

if(variable == thing1 || thing2 || thing3) 

Une telle syntaxe existe-t-elle dans C#?

+0

Les deux syntaxes existent mais font des choses complètement différentes. –

+1

Ne sacrifiez pas la clarté pour la brièveté. Cela dit, il y a déjà de bonnes réponses ci-dessous. Assurez-vous simplement qu'il est plus facile de lire pour le prochain gars/gal, pas plus difficile. – pcdev

Répondre

8

Si la syntaxe concise est très important pour vous, vous pouvez définir une méthode d'extension:

public static class ObjectExtensions 
{ 
    public static bool In<T>(this T item, params T[] elements) 
    { 
     return elements.Contains(item); 
    } 
} 

Vous pouvez ensuite utiliser cela comme si:

if (variable.In(thing1, thing2, thing3)) 

Cela dit, si la liste vérifiée ne changera pas, je préférerais le déclarer comme un champ en lecture seule statique, et appeler Contains par rapport à cela. La méthode d'extension ci-dessus peut entraîner l'attribution d'un nouveau tableau chaque fois qu'il est appelé, ce qui peut nuire aux performances dans les boucles serrées.

private static readonly Thing[] _things = new [] { thing1, thing2, thing3 }; 

public void ProcessThing(Thing variable) 
{ 
    if (_things.Contains(variable)) 
    { 
     // ... 
    } 
} 

En outre, si la liste en cours de vérification contre contient plus de quelques articles, utilisez un HashSet<T> à la place.

+1

Oww ... belle syntaxe ... tout comme OP demandé :-) – Stefan

+0

Y at-il une raison pour que cela ne soit pas autorisé comme pseudo-code de l'OP? –

+0

@CamiloTerevinto: C'est une question de conception du langage. Certaines considérations doivent être prises en compte, telles que les conversions de type, les courts-circuits, l'associativité des opérateurs, etc. Si quelque chose, je serais plus enclin à avoir une syntaxe de type SQL avec le mot-clé 'in', qui devient très similaire à la méthode d'extension ci-dessus. – Douglas

1

Vous cound faire:

int[] aux=new int[]{1,2,3}; 
if(Array.contains(aux, value)) 
3

Mettez les chaînes de test dans une liste ou un tableau et appelez Contains:.

var testers = new [] { "foo1", "foo2" }; 

if (testers.Contains("subject")) 
{ 
    // test succeeded 
} 

Comme alternative:

if (new [] {"foo1", "foo2"}.Contains("subject")) 
{ 
    // test succeeded 
} 
2

Certaines personnes préfèrent une méthode d'extension:

public static bool IsOneOf<T>(this T self, params T[] values) => values.Contains(self); 

ou similaire.

Ensuite, vous pouvez dire:

if (variable.IsOneOf(thing1, thing2, thing3)) 

Oups, je vois Douglas était d'abord avec cette approche.

Il utilise implicitement le comparateur d'égalité par défaut de T.

L'inconvénient est que vous créez une méthode d'extension à tous les types. Si vous n'en avez besoin que pour, par exemple, string, vous pouvez bien sûr créer une méthode d'extension moins générale.

0

Vous avez quelques options.

  1. Utilisez switch (si thing1-thing3 sont des expressions constantes)

    switch variable 
        case thing1: 
        case thing2: 
        case thing3: 
         DoSomething(); 
         break; 
    
  2. Utilisez un RegEx (fonctionne uniquement pour les chaînes)

    if (RegEx.Match(variable, "^(thing1|thing2|thing3)")) 
    { 
        DoSomething(); 
    } 
    
  3. Utilisez un tableau

    string[] searchFor = new string[] {thing1, thing2, thing3}; 
    if (searchFor.Contains(variable)) 
    { 
        DoSomething(); 
    }