2012-03-07 10 views
5

¿Hay una sintaxis abreviada en C# para hacer esto:de prueba para varios valores en una sentencia if en C#

if ((x == 1) || (x==2) || (x==5) || (x==13) || (x==14)) 

... más corto? Algo así como (hipotéticamente)

if (x in {1, 2, 5, 13, 14}) 

I "sentir" como si existe, sólo estoy quedarse corto mental y saltones. En realidad, tengo que probar un montón de enumeraciones con frecuencia y es ilegible. También odio hacer una pequeña función auxiliar si el lenguaje ya lo admite.

¡Gracias de antemano!

Editar

hay soluciones inteligentes que implican las listas ... pero yo estaba esperando para una construcción lógica pura de algún tipo. Si no existe, que así sea. ¡Gracias!

+0

http://stackoverflow.com/questions/3907299/c-sharp-if-statements-matching-multiple-values ​​ –

+0

No es necesario usar comillas interiores: 'si (x == 1 || x == 2 || x == 5 ...) 'excepto si ha usado Pascal/Delphi varios años y tiene" distorsión profesional ". – i486

Respuesta

12

Prueba esto:

if ((new[]{1, 2, 5, 13, 14}).Contains(x)) ... 
+0

me ganaste. –

+0

Sí ... supongo que sería un poco más limpio que lo que tengo. En ausencia de una sintaxis super-simple, solo uso una función auxiliar como 3907299 que publicó "Jeremy D". Gracias de cualquier manera. – Adamlive

+0

'HashSet ' ¡sería más rápido que 'Array'! =) –

0

No, no hay soporte para comparar directamente el estilo. Sin embargo, puede usar métodos LINQ como Contiene(). Podría dar un ejemplo pero depende de cómo se almacenan originalmente los elementos de datos.

2

Aunque creo que si la declaración está muy bien, y hacer que el código escrito por el amor de breifness es inútil, aquí va:

Primera aproximación, asumiendo que usted quiere ir a la ruta de LINQ:

if ((new[]{1,2,5,13,14}).Contains(x)){ 
} 

Segundo enfoque, ArrayList

if ((new System.Collections.ArrayList(new[]{1,2,5,13,14})).Contains(x)){ 
} 

tercer enfoque, lista:

if ((new System.Collections.Generic.List<Int32>(new[]{1,2,5,13,14})).Contains(x)){ 
} 

Pero tenga en cuenta todos estos agregan más sobrecarga (y realmente no agregan mucho en cuanto a legibilidad, dada la consideración del rendimiento).

oh, y working example of the above.

+0

Buen punto sobre la sobrecarga. Esto se ejecutará con mucha más frecuencia de la que necesito para leerlo. – Adamlive

0

tal vez podría hacer algo como esto:

if(Array.LastIndexOf(new int[]{1, 2,3,4}, x) != -1) 
{ 
    //YOUR CODE HERE 
} 

No se ha probado, pero creo que esto funcionaría.

editar Parece que una respuesta similar ya ha sido publicada.

2

Me gustaría recomendar el uso de HashSet(T) Class para comprobar si el elemento pertenece al conjunto de elementos.

Además, como HashSet<T> es un contenedor asociativo, su complejidad de búsqueda es O (1), es decir, constante de tiempo: HashSet(Of T).Contains Method, mientras Array y List<T> tiene lookup tiempo lineal: O (n). Por lo tanto, HashSet<T> sería el mejor para la búsqueda.

HashSet<int> numbers = new HashSet<int> { 1, 2, 5, 13, 14 }; 
int x = 1; 
if (numbers.Contains(x)) 
{ 
    Console.WriteLine("Contains!"); 
} 
Cuestiones relacionadas