2012-01-27 17 views
5

Estoy buscando una práctica estándar/mejor para escenarios donde necesito verificar la misma propiedad de un objeto contra una lista de valores que devuelven verdadero si alguno de los valores coincide con la propiedad.Necesita una mejor manera de comparar valores múltiples contra una propiedad y devolver verdadero;

Actualmente el código se parece a esto (que no escribo, estoy buscando a refactorizar) ...

if (object.property == "string1" 
        || object.property == "string2" 
        || object.property == "string3" 
         || object.property == "string4" 
         || object.property == "string5" 
           || object.property == "string6" 
           || object.property == "string7" 
            || object.property == "string8" 
            || object.property == "string9" 
             || object.property == "string10" 
             || object.property == "string11" 
              || object.property == "string12" 
              || object.property == "string13" 
               || object.property == "string14" 
               || object.property == "string15") 
+1

si has cadenas const - que usar la construcción 'switch-case'. –

+0

Todas las respuestas válidas y mucho más bonitas que las que proporcioné. Buen trabajo muchachos. Voy a darle mi voto a Andrew porque parece ser el más legible y debería asignar la menor cantidad de memoria posible, ya que usa una matriz de cadenas. De nuevo Muchas gracias por las excelentes respuestas. – TXRAckAck

Respuesta

9
IEnumerable<string> items = new List<string>{ "string1", "string2" }; 

bool match = items.Contains(object.property); 
+0

impresionante y rápido – TXRAckAck

+0

@TXRAckAck - gracias ;-) –

+3

HashSet sería una mejor solución. O (1) en lugar de O (n). ... suponiendo que reutilice el HashSet , y no lo compile todo el tiempo. – MarkPflug

1

Usted puede poner los valores en una List<string> y luego hacer esto:

List<string> values = new List<string>() {"string1", "string2"}; 

if(values.Contains(object.Property)) return true; 
4

Otras respuestas sugieren el uso de un List<string>, pero HashSet<string> es más adecuado para esta tarea:

HashSet<string> set = new HashSet<string>() { "string1", "string2", ..., "string15" }; 

if (set.Contains(object.Property)) 
    //... do something ... 

O, como sugiere anatoliiG, dejar que el compilador de manejarlo:

switch (object.property) 
{ 
    case "string1": 
    case "string2": 
    //... 
    case "string15": 
     //... do something ... 
     break; 
} 
+0

Solo asegúrese de reutilizar el HashSet, o no habrá ningún beneficio de rendimiento sobre List . – MarkPflug

+0

Si el hashset ya está calculado, podría ser más rápido que una declaración de cambio gigante (especialmente cierto para conjuntos de datos más grandes). – Matthew

+0

@Mark absolutamente correcto, y gracias por señalarlo. La 'nueva construcción de Foo()' en el código de ejemplo a menudo conduce a un código ineficiente o incorrecto; 'new Random()' es un ejemplo frecuente de eso. – phoog

0

Usted puede tratar de LINQ para un código más concisa, tales como:

bool match = new string[] { "string1", "string2" }.Any(p => p == object.property); 
+0

Votación por muchos motivos. No menos importante es el uso de "Count()> 0" en lugar de Any(); – MarkPflug

+0

Tiene citas en object.property. Eso claramente no es lo que querías decir. Además, para más conciso, ¿qué hay de nuevo [] {"string1", "string2"}. No necesita la "Cadena", se puede inferir. Hecho. – MarkPflug

+0

Muy bueno sobre el hecho de que la cadena se puede inferir. Nunca pensé en eso. Sí, no quise decir citas alrededor de obj.prop. –

Cuestiones relacionadas