Comment vérifier si une chaîne contient des chaînes

Je veux vérifier si une Ssortingng s contient “a” ou “b” ou “c”, en C #. Je cherche une solution plus agréable que d’utiliser

if (s.contains("a")||s.contains("b")||s.contains("c")) 

Si vous recherchez des caractères uniques, vous pouvez utiliser Ssortingng.IndexOfAny() .

Si vous voulez des chaînes arbitraires, alors je ne suis pas au courant d’une méthode .NET pour obtenir cela “directement”, même si une expression régulière fonctionnerait.

Eh bien, il y a toujours ceci:

 public static bool ContainsAny(this ssortingng haystack, params ssortingng[] needles) { foreach (ssortingng needle in needles) { if (haystack.Contains(needle)) return true; } return false; } 

Usage:

 bool anyLuck = s.ContainsAny("a", "b", "c"); 

Rien ne va égaler la performance de votre chaîne de || comparaisons, cependant.

Voici une solution LINQ pratiquement identique mais plus évolutive:

 new[] { "a", "b", "c" }.Any(c => s.Contains(c)) 
 var values = new [] {"abc", "def", "ghj"}; var str = "abcedasdkljre"; values.Any(str.Contains); 

Vous pouvez essayer avec une expression régulière

 ssortingng s; Regex r = new Regex ("a|b|c"); bool containsAny = r.IsMatch (s); 

Si vous avez besoin de ContainsAny avec une SsortingngComparison spécifique (par exemple pour ignorer la casse), vous pouvez utiliser cette méthode.

 public static class SsortingngExtensions { public static bool ContainsAny(this ssortingng input, IEnumerable containsKeywords, SsortingngComparison comparisonType) { return containsKeywords.Any(keyword => input.IndexOf(keyword, comparisonType) >= 0); } } 

Utilisation avec SsortingngComparison.CurrentCultureIgnoreCase :

 var input = "My STRING contains Many Subssortingngs"; var subssortingngs = new[] {"ssortingng", "many subssortingngs", "not containing this ssortingng" }; input.ContainsAny(subssortingngs, SsortingngComparison.CurrentCultureIgnoreCase); // The statement above returns true. ”xyz”.ContainsAny(subssortingngs, SsortingngComparison.CurrentCultureIgnoreCase); // This statement returns false. 

C’est une “solution plus agréable” et assez simple

 if(new ssortingng[] { "A", "B", ... }.Any(s=>mySsortingng.Contains(s))) 

Comme une chaîne est une collection de caractères, vous pouvez utiliser les méthodes d’extension LINQ sur celles-ci:

 if (s.Any(c => c == 'a' || c == 'b' || c == 'c')) ... 

Cela scannera la chaîne une fois et s’arrêtera à la première occurrence, au lieu d’parsingr la chaîne une fois pour chaque caractère jusqu’à ce qu’une correspondance soit trouvée.

Cela peut également être utilisé pour n’importe quelle expression que vous aimez, par exemple pour vérifier une gamme de caractères:

 if (s.Any(c => c >= 'a' && c < = 'c')) ... 
 public static bool ContainsAny(this ssortingng haystack, IEnumerable needles) { return needles.Any(haystack.Contains); } 
 // Nice method's name, @Dan Tao public static bool ContainsAny(this ssortingng value, params ssortingng[] params) { return params.Any(p => value.Compare(p) > 0); // or return params.Any(p => value.Contains(p)); } 

Any pour tous, All pour tous

 List includedWords = new List() { "a", "b", "c" }; bool ssortingng_contains_words = includedWords.Exists(o => s.Contains(o)); 

Vous pouvez utiliser des expressions régulières

 if(System.Text.RegularExpressions.IsMatch("a|b|c")) 
  static void Main(ssortingng[] args) { ssortingng illegalCharacters = "!@#$%^&*()\\/{}|<>,.~`?"; //We'll call these the bad guys string goodUserName = "John Wesson"; //This is a good guy. We know it. We can see it! //But what if we want the program to make sure? string badUserName = "*_Wesson*_John!?"; //We can see this has one of the bad guys. Underscores not restricted. Console.WriteLine("goodUserName " + goodUserName + (!HasWantedCharacters(goodUserName, illegalCharacters) ? " contains no illegal characters and is valid" : //This line is the expected result " contains one or more illegal characters and is invalid")); string captured = ""; Console.WriteLine("badUserName " + badUserName + (!HasWantedCharacters(badUserName, illegalCharacters, out captured) ? " contains no illegal characters and is valid" : //We can expect this line to print and show us the bad ones " is invalid and contains the following illegal characters: " + captured)); } //Takes a string to check for the presence of one or more of the wanted characters within a string //As soon as one of the wanted characters is encountered, return true //This is useful if a character is required, but NOT if a specific frequency is needed //ie. you wouldn't use this to validate an email address //but could use it to make sure a username is only alphanumeric static bool HasWantedCharacters(string source, string wantedCharacters) { foreach(char s in source) //One by one, loop through the characters in source { foreach(char c in wantedCharacters) //One by one, loop through the wanted characters { if (c == s) //Is the current illegalChar here in the string? return true; } } return false; } //Overloaded version of HasWantedCharacters //Checks to see if any one of the wantedCharacters is contained within the source string //string source ~ String to test //string wantedCharacters ~ string of characters to check for static bool HasWantedCharacters(string source, string wantedCharacters, out string capturedCharacters) { capturedCharacters = ""; //Haven't found any wanted characters yet foreach(char s in source) { foreach(char c in wantedCharacters) //Is the current illegalChar here in the string? { if(c == s) { if(!capturedCharacters.Contains(c.ToString())) capturedCharacters += c.ToString(); //Send these characters to whoever's asking } } } if (capturedCharacters.Length > 0) return true; else return false; } 

Si vous recherchez des chaînes arbitraires et pas seulement des caractères, vous pouvez utiliser une surcharge d’IndexOfAny qui prend les arguments de chaîne du nouveau projet NLib :

 if (s.IndexOfAny("aaa", "bbb", "ccc", SsortingngComparison.Ordinal) >= 0)