2009-02-01 10 views
38

Quiero comprobar si Value1 a continuación contiene "abc" dentro de los primeros X caracteres. ¿Cómo verifica esto con una declaración if?Cómo determinar si la cadena contiene subcadena específica dentro de los primeros X caracteres

var Value1 = "ddabcgghh"; 

if (Value1.Contains("abc")) 
{ 
    found = true; 
} 

Podría estar dentro de los primeros 3, 4 o 5 caracteres.

+0

siento chicos que no estaba claro cuando por primera vez, el valor de ABC (esto cambia) tal vez dentro de la primera X número de caracteres. P.ej. 3,4,5, etc. entonces StartsWith no funcionará para mí. –

Respuesta

7
if (Value1.StartsWith("abc")) { found = true; } 
+0

no creo que cumpla con los requisitos. No – Will

+0

es que los mismos que encontraron Value1.StartsWith = ("ABC")? –

+1

@Will - cierto, pero como en todos los proyectos de software, los requisitos han cambiado desde que tuve oportunidad de hacerlo. @Jim - Es cierto, pero guardé el estilo del autor de la pregunta. – olle

3

Estás cerca ... pero el uso: if (Value1.StartsWith("abc"))

3

Esto es lo que necesita:

if (Value1.StartsWith("abc")) 
{ 
found = true; 
} 
41

O si es necesario establecer el valor de encontrado:

found = Value1.StartsWith("abc") 

Editar: Debido a su edición, me gustaría hacer algo como:

found = Value1.Substring(0, 5).Contains("abc") 
+0

También agregue un cheque para ver si Value1 String tiene una longitud de 5 antes de hacer esto. –

10

versión más corta:

found = Value1.StartsWith("abc"); 

lo siento, pero yo soy un purista de código 'menos'.


Dada la edición del interrogador me habría importado ir con algo que aceptaron una compensación, esto puede ser en realidad un gran lugar a un método de extensión que sobrecarga StartsWith

public static class StackOverflowExtensions 
{ 
    public static bool StartsWith(this String val, string findString, int count) 
    { 
     return val.Substring(0, count).Contains(findString); 
    } 
} 
+0

Creo que quería unir "1abcwhatever" y "xyabcwhatever" también. – Will

+0

cambió eso después de que la mayoría de nosotros habíamos escrito una respuesta – keithwarren7

3

Una versión más explícita es

found = Value1.StartsWith("abc", StringComparison.Ordinal); 

Es mejor siempre enumerar explícitamente la comparación particular que está haciendo. La clase String puede ser algo inconsistente con el tipo de comparaciones que se utilizan.

5

Uso IndexOf es más fácil y alto rendimiento.

int index = Value1.IndexOf("abc"); 
bool found = index >= 0 && index < x; 
+0

pero menos eficiente si _Value1_ es una cadena larga y _x_ es pequeña. –

3

También puede utilizar expresiones regulares (menos legibles aunque)

string regex = "^.{0,7}abc"; 

System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(regex); 
string Value1 = "sssddabcgghh"; 

Console.WriteLine(reg.Match(Value1).Success); 
+1

Esto funciona, pero la expresión regular es ineficiente. Capturará los primeros 7 caracteres y luego probará "abc". Si esa prueba falla, hará una copia de seguridad de un personaje e intentará nuevamente. Este proceso continuará hasta que se encuentre una coincidencia o hasta que se llegue al comienzo de la cadena. El equivalente no codicioso es _ "^. {0,7}? Abc" _. –

16

me gustaría utilizar uno de los de las sobrecargas del método IndexOf

bool found = Value1.IndexOf("abc", 0, 7) != -1; 
1

Añadiendo de la respuesta a continuación he creado este método:

public static bool ContainsInvalidStrings(IList<string> invalidStrings,string stringToCheck) 
    { 

     foreach (string invalidString in invalidStrings) 
     { 
      var index = stringToCheck.IndexOf(invalidString, StringComparison.InvariantCultureIgnoreCase); 
      if (index != -1) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

que puede ser utilizado como esto:

  var unsupportedTypes = new List<string>() 
     { 
      "POINT Empty", 
      "MULTIPOINT", 
      "MULTILINESTRING", 
      "MULTIPOLYGON", 
      "GEOMETRYCOLLECTION", 
      "CIRCULARSTRING", 
      "COMPOUNDCURVE", 
      "CURVEPOLYGON", 
      "MULTICURVE", 
      "TRIANGLE", 
      "TIN", 
      "POLYHEDRALSURFACE" 
     }; 


      bool hasInvalidValues = ContainsInvalidStrings(unsupportedTypes,possibleWKT); 

puede comprobar si hay múltiples valores no válidos de esta manera.

Cuestiones relacionadas