2009-02-01 10 views
38

Je veux vérifier si Value1 ci-dessous contient "abc" dans les X premiers caractères. Comment vérifieriez-vous ceci avec une déclaration if?Comment déterminer si la chaîne contient une sous-chaîne spécifique dans les X premiers caractères

var Value1 = "ddabcgghh"; 

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

Il pourrait s'agir des 3, 4 ou 5 premiers caractères.

+0

Désolé les gars, je n'étais pas clair quand j'ai posté pour la première fois, la valeur abc (cela change) peut-être dans le premier X nombre de caractères. Par exemple. 3,4,5 etc, donc StartsWith ne fonctionnera pas pour moi. –

Répondre

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

Je ne pense pas que cela répond aux exigences. – Will

+0

N'est-ce pas la même chose que found = Value1.StartsWith ("abc")? –

+1

@Will - true, mais comme dans tous les projets de logiciels, les exigences ont été modifiées depuis que j'ai essayé. @Jim - Vrai mais j'ai gardé le style de l'auteur de la question. – olle

3

Vous êtes proche ... mais l'utilisation: if (Value1.StartsWith("abc"))

3

C'est ce que vous avez besoin:

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

Ou si vous avez besoin de définir la valeur de trouvé:

found = Value1.StartsWith("abc") 

Modifier: Étant donné votre modification, je voudrais faire quelque chose comme:

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

Ajoutez également une vérification pour voir si la chaîne Value1 a une longueur de 5 avant de le faire. –

10

version plus courte:

found = Value1.StartsWith("abc"); 

désolé, mais je suis tatillonne pour le code 'moins'.


Compte tenu de la modification du questionneur je fait aller avec quelque chose qui a accepté un décalage, cela peut en effet être un grand endroit pour une méthode d'extension surchargeant StartsWith

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

Je pense qu'il voulait aussi "1abcwhatever" et "xyabcwhatever". – Will

+0

il a changé cela après que la plupart d'entre nous avait écrit une réponse – keithwarren7

3

Une version plus explicite est

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

Il est préférable de toujours lister explicitement la comparaison que vous faites. La classe String peut être quelque peu incompatible avec le type de comparaison utilisé.

5

Utiliser IndexOf est plus facile et plus performant.

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

Mais moins efficace si _Value1_ est une longue chaîne et _x_ est petite. –

3

Vous pouvez également utiliser des expressions régulières (moins lisibles si)

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

Cela fonctionne mais l'expression régulière est inefficace. Il va saisir les 7 premiers caractères et ensuite tester pour "abc". Si ce test échoue, il sauvegarde un caractère et réessaie. Ce processus continuera jusqu'à ce qu'une correspondance soit trouvée ou que le début de la chaîne soit atteint. L'équivalent non gourmand est _ "^. {0,7}? Abc" _. –

16

Je voudrais utiliser l'un des des surcharges de la méthode IndexOf

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

Ajout sur de la réponse ci-dessous j'ai créé cette méthode:

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; 
    } 

il peut être utilisé comme ceci:

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


      bool hasInvalidValues = ContainsInvalidStrings(unsupportedTypes,possibleWKT); 

vous pouvez vérifier plusieurs valeurs invalides de cette façon.

Questions connexes