2010-05-11 5 views
2

est-il possible de comparer plusieurs variables à une constante dans une instruction if? Il serait très utile si au lieu deC# Multi-comparaisons possibles?

if (col.Name != "Organization" && col.Name != "Contacts" && col.Name != "Orders") { } 

je pouvais dire

if (col.Name != "Organization" || "Contacts" || "Orders") { } 

Et je sais que je pourrais utiliser une liste, mais dans certains cas, je ne veux pas ... Merci!

Répondre

5

Si vous recherchez simplement un raccourci, vous n'obtiendrez probablement pas grand-chose. ChaosPandion a mentionné l'instruction switch, et voici quelque chose qui utilise un tableau.

if (new string[] { "Bar", "Baz", "Blah" }.Contains(foo)) 
{ 
    // do something 
} 
+0

Je ne pense pas que vous gagniez beaucoup en utilisant ceci sur un commutateur ou une instruction if. – ChaosPandion

+0

Il est plus facile d'affirmer ce que ce code fait en tant que lecteur humain et de vérifier qu'il est correct par rapport à la question d'origine. (N'a aucun bogue évident vs évidemment n'a aucun bogue) – earlNameless

+0

j'aime ceci. fonctionnellement bien sûr, il ne gagne rien, ChaosPandion, mais en ce qui concerne la lisibilité et le code propre, je l'aime personnellement. Bien sûr, ce serait bien s'il y avait quelque chose de construit dans la langue plutôt que d'être si hackish, mais toujours une bonne solution pour l'instant. Merci! –

5

L'instruction switch est à peu près aussi bonne que vous l'aurez.

switch (col.Name) 
{ 
    case "Organization": 
    case "Contacts": 
    case "Orders": 
     break; 
    default: 
     break; 
} 
+0

oui. savait à ce sujet. mais le but était de réduire le code inutile. Je ne savais pas s'il y avait un moyen avec Linq ou quelque chose. –

+0

Vous pouvez utiliser "Linq" dans une ronde de façon. Afin de mettre en œuvre Linq, ils devaient ajouter des méthodes d'extension. Vous pouvez utiliser cela à votre avantage pour ajouter des méthodes à la chaîne, ce qui rend votre code beaucoup plus concis. – John

+0

Le plus efficace est le plus bavard. À quelle fréquence cela se révèle-t-il être le «cas»? – harpo

1

Vous pouvez également ajouter des méthodes d'extension à la classe de chaîne pour faire vos comparaisons moins verbeux. J'irais avec la solution fournie par Anthony et le collerais dans une méthode d'extension appelée EqualsAny ou une telle.

1

Je seconde le commentaire de John sur les méthodes d'extension. Je ferais quelque chose comme ceci:

public static class StringExtensions 
{ 
    public static bool In(this string input, params string[] test) 
    { 
     foreach (var item in test) 
      if (item.CompareTo(input) == 0) 
       return true; 
     return false; 
    } 
} 

Vous pouvez alors l'appeler comme ceci:

 string hi = "foo"; 
     if (hi.In("foo", "bar")) { 
      // Do stuff 
     } 
+0

Notez que vous pouvez également mettre à niveau vers le haut à une extension d'objet - il suffit de modifier l'instruction CompareTo à un strict == –

+0

Coupez ce code en deux avec un appel à 'Array.IndexOf'. –

+0

Vous pouvez simplifier les composants internes en utilisant 'return test.Contains (input);' ou 'return test.Any (item => item == input);' plutôt qu'une boucle foreach. –

Questions connexes