2012-01-20 5 views
5

Por ejemplo, si en un cuadro de texto está lleno de muchos números de parte diferentes de una lista de materiales para partes de la computadora, solo quiero un tipo de cable cat5 en cualquier momento dado, y si se ven dos tipos diferentes, para advertir al usuario. Los números de parte del cable cat5 podrían ser: cat5PART # 1, cat5PART # 2, y cat5PART # 3. Entonces, si solo se ve un número de pieza cat5, no hay preocupaciones, pero tan pronto como se vean dos tipos diferentes o más, para advertir. Podría escribirlo fácilmente tres veces diferentes para cada variación, pero en una lista más grande de partes, tomaría más tiempo y correría el riesgo de cometer errores. Además, me encantaría saber cómo los programadores manejan este tipo de funciones. Tampoco sé cómo se llama, así que no estoy seguro de cómo buscarlo, a pesar de saber que van a haber muchas soluciones para esta situación exacta, así que es frustrante tener que molestar a las personas en un foro para algo tan simple.Cómo evitar escribir cada variación de una instrucción simple "si contiene" para diferentes cadenas

Un ejemplo de mi código que obviamente no funciona porque solo advertiría si las tres partes se detectaron no solo si se detectaron dos está debajo. Supongo que usaría alguna variación de & y | o tal vez es algo completamente diferente?

Básicamente yo no quiero tener que escribir a cabo a una escala mayor

si contiene la parte 1 y parte 2

si contiene partes 1 y 3

si contiene la parte 2 y parte 3

Gracias.

if ((textBox2.Text.Contains("PART#1")) 
     && (textBox2.Text.Contains("PART#2")) 
     && (textBox2.Text.Contains("PART#3"))) 
       { 
      MessageBox.Show("2 types of cat5 part numbers seen at the same time"); 
       } 
+0

Definitivamente no ayuda que esté envolviendo sus subexpresiones en paréntesis innecesarios. – ChaosPandion

+1

... pero ciertamente no duele, así que no puedo ver cómo eso es relevante para la pregunta. –

+0

Intenté eliminar los paréntesis y obtuve errores, ¿podría ayudarme a entender cuáles debería eliminar solo para que yo sepa? ¿También es más fácil leer el código o mejora el rendimiento cuando tienes menos paréntesis a gran escala?Thx – Saintjah

Respuesta

6

Puede probar esto:

string[] parts = new [] {"PART#1", "PART#2", "PART#3"}; 
int count = parts.Count(s => textBox2.Text.Contains(s)); 
if (count >= 2) ... 
+0

Muchas gracias a usted y al cristal roto, tiene tanto sentido ahora. Necesito pensar más fuera de la caja. – Saintjah

4

Puede utilizar LINQ/Count() para probar si al menos x cadenas que desea probar están contenidos en textBox2.Text:

string[] parts = { "PART#1", "PART#2", "PART#3" }; 
if(parts.Count(s=> textBox2.Text.Contains(s)) >= 2) 
{ 
    MessageBox.Show("2 types of cat5 part numbers seen at the same time"); 
} 
0

Agregue cada cadena en un List<string> y luego recorrer cada uno con un foreach declaración.

1

En esencia, este problema se resuelve mediante el diseño de las cosas un poco diferente.

Lo que realmente quieres es ejecutar algún tipo de validación de reglas sobre alguna entrada, entonces probablemente crearía algo un poco más general como ese, y luego cada regla contendría un buen conjunto de propiedades que desea comprobar. A continuación, debe llamar esto desde un tipo genérico de etapa "ejecutar reglas contra entrada" para procesar los datos.

Suena un poco exagerado, quizás, pero en general es bueno hacer cosas como esta para estar preparado para los cambios.

Al final (en la regla específica en sí) claramente tendría una implementación un poco como la suya, pero probablemente escrita de una manera más corta, como BrokenGlass ha demostrado.

Cuestiones relacionadas