2009-11-04 23 views
7

acabo de tener una idea de último nigth cuando se escribe una expresión si- y, a veces la expresión tienden a ser mucho cuando se tiene de esta manera:C# en el operador-sobrecarga

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

X puede ser enumeraciones, las cadenas , ints, chars obtienes la imagen.

Quiero saber si hay una manera más fácil de escribir esto. pienso del operador de SQL 'en', por ejemplo, como una eay para acortar la expresión:

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

Sé que no se puede escribir una expresión de este tipo con 'in' debido a que el analizador léxico y analizador del won compilador no lo reconoces

¿Quizás otras soluciones como métodos de extensión de diferentes tipos de x es la solución? En los próximos .NET 4.0 escuché algo sobre los métodos parametrizados, ¿debería eso resolver la n cantidad de parámetros suministrados a la expresión if?

Quizás me entiendas, ¿tienes idea de una buena práctica/solución a esta pregunta?

/Daniel

+0

encuentro el título un poco confuso. Parece que quieres usar C# en una sobrecarga del operador. Puse el IN en mayúsculas por falta de una mejor idea de cómo hacerlo más claro. –

+0

pregunta interesante aunque –

Respuesta

13

Pruebe lo siguiente

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

Eso es muy elegante. –

+3

Con inferencia de tipo, incluso puede omitir el 'int' (creo). – Svish

+0

@Svish, no se dio cuenta de que era posible, pero verificó que funciona con 2010 Beta2. Respuesta actualizada – JaredPar

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

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

Creo que quería int y no cadena allí. – JaredPar

+0

Creo que la pregunta fue para todos los tipos. –

+1

Hmm .. Se requiere más café. – Paddy

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

¿Por qué tener un método genérico, que solo toma una lista de ints? Considera usar params T [] args en su lugar, que luego puedes llamar. Contiende directamente. –

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é tal 'return list.Contains (x);'? –

+0

array no tiene el método Contiene –

+0

La matriz implementa 'IEnumerable ' que tiene un método de extensión Contiene en System.Linq – Lee

0

Dado que x es un entero se podría escribir un método de extensión de este modo:

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

que suelo escribir un Extension Method de la siguiente manera:

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

que puede ser utilizado como esto:

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

Me gusta porque es genérico y usa el método Contiene en lugar del operador ==. –

+0

No puedo leer bien esto ... Se siente mucho más natural. También agregué una sobrecarga: bool estático público En (esta fuente de T, lista de IEnumerable ) con el mismo cuerpo. – Crisfole