2009-11-04 6 views
7

Je viens d'avoir une idée dernière nigth lors de l'écriture d'un si l'expression et parfois l'expression ont tendance à être longue quand vous avez comme ceci:C# en surcharge opérateur

if(x == 1 || x == 2 || x == 33 || x == 4 || x == -5 || x == 61) { ... } 

x peut être énumérations, cordes , ints, chars vous obtenez l'image.

Je veux savoir s'il existe un moyen plus simple d'écrire ceci. je pense à l'opérateur de sql « dans » par exemple en eay pour raccourcir l'expression:

if(x in (1,2,33,4,-5,61)) { ... } 

Je sais que vous ne pouvez pas écrire une expression comme celui-ci avec « dans » parce que le lexer et parser du compilateur won ne le reconnais pas.

Peut-être d'autres solutions comme méthodes d'extension de différents types de x est la solution? Dans le .NET 4.0 à venir, j'ai entendu parler des méthodes paramétrées, devrait-il résoudre la quantité n de paramètres fournis à l'expression if? Peut-être que vous me comprenez, avez-vous une idée d'une bonne pratique/solution à cette question?

/Daniel

+0

Je trouve le titre un peu confus. On dirait que vous voulez utiliser C# dans une surcharge d'opérateur. Je mets l'IN en majuscules par manque de meilleure idée de comment rendre cela plus clair. –

+0

question intéressante si –

Répondre

13

Essayez le

suivant
if ((new []{1,2,33,4,-5,61}).Any(i => x == i)) { 
    ... 
} 
+0

C'est assez élégant. –

+3

Avec l'inférence de type, vous pouvez même ignorer 'int' (je pense). – Svish

+0

@Svish, ne s'est pas rendu compte que c'était possible mais a vérifié qu'il fonctionne avec 2010 Beta2. Réponse mise à jour – JaredPar

0
string[] possible = new string[3] { 1, 2, 3); 

    if (possible.Contains(x)) { ... 
+0

Je pense que vous vouliez int et pas de chaîne là. – JaredPar

+0

Je pense que la question était destinée à tous les types. –

+1

Hmm .. Plus de café requis. – Paddy

0
bool In<T>(T num, params int args) 
    { 
     return (new List<T>(args)).Contains(num); 
    } 
+1

Pourquoi avoir une méthode générique, qui ne prend qu'une liste d'ints? Pensez à utiliser plutôt les arguments T [] args - que vous pouvez ensuite appeler .Contient directement. –

1
public static bool In<T>(this T X, params T[] list) 
    { 
     foreach (var item in list) 
     { 
      if (X.Equals(item)) 
       return true; 
     } 
     return false; 
    } 
+0

qu'en est-il de 'return list.Contains (x);'? –

+0

tableau n'a pas Contient la méthode –

+0

Array implémente 'IEnumerable ' qui a une méthode d'extension Contains dans System.Linq – Lee

0

Étant donné que x est un entier que vous pouvez écrire une méthode d'extension comme ceci:

public static bool In(this int i, params int[] values){ 
    foreach(int v in values) { 
     if (i == v) { 
      return true; 
     } 
    } 
    return false; 
} 
18

Je l'habitude d'écrire un Extension Method comme suit:

public static bool In<T>(this T source, params T[] list) 
{ 
    if(null==source) throw new ArgumentNullException("source"); 
    return list.Contains(source); 
} 

qui peut être utilisé comme ceci:

if(x.In(1,6,9,11)) 
{ 
     // do something.... 
} 
+1

J'aime celui-ci parce qu'il est générique et utilise la méthode Contient plutôt que l'opérateur ==. –

+0

Je ne peux pas assez le pouce en l'air ... C'est tellement plus naturel. J'ai également ajouté une surcharge: public statique bool Dans (cette source T, IEnumerable liste) avec le même corps. – Crisfole