2011-11-22 8 views
24

Problema: Prueba si x ∉ {2, 3, 61, 71}C#: ¿La manera más elegante de probar si int x es un elemento de un conjunto dado?

I se preguntaba a menudo si no hay una manera mejor que:

if (x != 2 && x != 3 && x != 61 && x != 71) 
{ 
    // do things 
} 

y

if (!new List<int>{ 2, 3, 61, 71 }.Contains(x)) 
{ 
    // do things 
} 

Este último uno parece bastante elegante, pero en realidad es algo irritante si lo lees, especialmente debido a la inversión. Es algo feo porque en inglés decimos "x no es elemento de ...", que es difícil de expresar en C# sin irritar la sobrecarga. Tal vez uno podría decir if (Object(x).IsElementOf(new[] { ... })) o menos?

Hmm .. alguna sugerencia? ¿Hay algún método estándar .Net para probar cosas como esa?

+2

Este es un duplicado pero estoy teniendo un poco de problemas para encontrar la otra pregunta a mí mismo ... – BoltClock

+0

no puedo votar a cerrar, se acabó, pero http://stackoverflow.com/questions/163732/recommended-net-class-for-a-collection-of-unique-integers – user7116

+5

@Efrain, ¿quiso decir '&&' en lugar de '|| ¿? Los dos fragmentos de código no hacen lo mismo ... –

Respuesta

41

utilizo un método de extensión:

using System.Linq; 

... 

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

... 


if (!x.In(2,3,61,71)) 
... 

Puede cambiar el nombre a IsElementOf si se prefiere este nombre ...

+0

Nota para las personas que se preguntan, el método' Contains' en la matriz es proporcionado por los espacios de nombres LINQ. –

+1

@ AdamHouldsworth, buen punto, gracias. Agregué la cláusula de uso necesaria para que quede claro –

+0

No hay problema, +1 en ambos sentidos por un fragmento muy lindo. No me da vergüenza admitir que es probable que plagiaré eso en el futuro :-) –

0
var list=CreateNewList(); //returns your list of elements 
var element=GetElement(); //returns an element that might be in the list 
if(list.Any(x=>x.Equals(element)) 
{ 
    //do something 
} 

Todavía está invertida de lo que estamos acostumbrados pero es más expresivo (si la lista tiene cualquier valor que sea igual a elemento).

5

usted podría utilizar LinQ siguiente método:

var list = new List<int> { 1, 2, 3, 4, 5 }; 
var number = 3; 

if (list.Any(item => item == number)) 
    //number is in the list 

Y para la legibilidad se puede poner en un método de extensión:

public static bool IsElementOf(this int n, IEnumerable<int> list) 
{ 
    return list.Any(i => n == i); 
} 

//usage 
if(3.IsElementOf(list)) //in the list 
0

Suponiendo que quería decir & & y no ||, se puede solo escribe un func y utilízalo en tu código. Puede acortar la nueva parte [] ya que el tipo (int) es introducido por el parámetro de la función.

Func<int, bool> IsSafe = x => !new[] { 2, 3, 61, 71 }.Contains(x); 

Console.WriteLine(IsSafe(68)); // is true 
Console.WriteLine(IsSafe(2)); // is false 
1

¿qué pasa con

if(new[] { 2, 3, 61, 71 }.Except(x).FirstOrDefault() != 0) 
{ 
    ... 
} 

o algo en ese sentido?

5

vieja pregunta, pero no he visto esta respuesta simple:

!new []{2, 3, 61, 71}.Contains(x) 
Cuestiones relacionadas