Existe-t-il un moyen de rendre le retour suivant vrai?
string title = "ASTRINGTOTEST";
title.Contains("string");
Il ne semble pas y avoir de surcharge qui me permette de régler la sensibilité à la casse. Actuellement, je les MAJUSCULE les deux, mais c'est juste idiot (par lequel je fais référence aux problèmes i18n qui viennent avec le boîtier de haut en bas).
MISE À JOUR
Cette question est ancienne et depuis lors, je me suis rendu compte que je demandais une réponse simple pour un sujet vraiment vaste et difficile si vous voulez bien l'enquêter.
Dans la plupart des cas, dans les bases de code monolingues et anglaises, cette réponse suffira. Je soupçonne que la plupart des gens qui viennent ici entrent dans cette catégorie, c'est la réponse la plus populaire.
Cette réponse soulève cependant le problème inhérent que nous ne pouvons pas comparer la casse insensible au texte jusqu'à ce que nous sachions que les deux textes sont la même culture et que nous savons ce que cette culture est. C'est peut-être une réponse moins populaire, mais je pense qu'elle est plus correcte et c'est pourquoi je l'ai marquée comme telle.
la source
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
? Cela utilise la bonne culture et est insensible à la casse, il n'alloue pas de chaînes minuscules temporaires, et cela évite la question de savoir si la conversion en minuscules et la comparaison sont toujours les mêmes qu'une comparaison insensible à la casse.Vous pouvez utiliser la méthode String.IndexOf et passer
StringComparison.OrdinalIgnoreCase
comme type de recherche à utiliser:Encore mieux est de définir une nouvelle méthode d'extension pour la chaîne:
Notez que la propagation nulle
?.
est disponible depuis C # 6.0 (VS 2015), pour les anciennes versions, utilisezUSAGE:
la source
paragraph.ToLower(culture).Contains(word.ToLower(culture))
qu'avecCultureInfo.InvariantCulture
et cela ne résout aucun problème de localisation. Pourquoi trop compliquer les choses? stackoverflow.com/a/15464440/284795ToLower
version comprend 2 allocations qui ne sont pas nécessaires dans une opération de comparaison / recherche. Pourquoi allouer inutilement dans un scénario qui n'en a pas besoin?string
queIEnumerable<char>
vous ne pouvez pas l'utiliser pour trouver des sousstring.IndexOf(string)
est d'utiliser la culture actuelle, tandis que la valeur par défaut pourstring.Contains(string)
est d'utiliser le comparateur ordinal. Comme nous le savons, la première peut être modifiée en choisissant une surcharge plus longue, tandis que la seconde ne peut pas être modifiée. Une conséquence de cette incohérence est l'exemple de code suivant:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; string self = "Waldstrasse"; string value = "straße"; Console.WriteLine(self.Contains(value));/* False */ Console.WriteLine(self.IndexOf(value) >= 0);/* True */
Vous pouvez utiliser
IndexOf()
comme ceci:Puisque 0 (zéro) peut être un index, vous vérifiez contre -1.
MSDN
la source
Solution alternative utilisant Regex:
la source
RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;
pour n'importe qui si cela peut aider."."
dans"This is a sample string that doesn't contain the search string"
. Ou essayez de chercher"(invalid"
, d'ailleurs.Regex.Escape
pourrait aider. Regex semble toujours inutile lorsqueIndexOf
/ extensionContains
est simple (et sans doute plus clair).Vous pouvez toujours monter ou descendre les cordes en premier.
Oups, je viens de voir ce dernier morceau. Une comparaison insensible à la casse ferait
*
probablement de*
même de toute façon, et si les performances ne sont pas un problème, je ne vois pas de problème avec la création de copies majuscules et la comparaison. J'aurais juré avoir vu une fois une comparaison insensible à la casse ...la source
.NET Core 2.0+ uniquement (à partir de maintenant)
.NET Core a eu une paire de méthodes pour gérer cela depuis la version 2.0:
Exemple:
Avec le temps, ils feront probablement leur chemin dans la norme .NET et, à partir de là, dans toutes les autres implémentations de la bibliothèque de classes de base.
la source
Un problème avec la réponse est qu'elle lèvera une exception si une chaîne est nulle. Vous pouvez ajouter cela comme un chèque afin qu'il ne:
la source
if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);
La classe StringExtension est la voie à suivre, j'ai combiné quelques-uns des articles ci-dessus pour donner un exemple de code complet:
la source
StringComparison
?C'est propre et simple.
la source
fileNamestr
a des caractères spéciaux regex (par exemple*
,+
,.
, etc.) , alors vous serez dans toute une surprise. La seule façon de faire fonctionner cette solution comme uneContains
fonction appropriée est de s'échapperfileNamestr
en faisantRegex.Escape(fileNamestr)
.OrdinalIgnoreCase, CurrentCultureIgnoreCase ou InvariantCultureIgnoreCase?
Comme cela est manquant, voici quelques recommandations sur le moment de l'utiliser:
Dos
StringComparison.OrdinalIgnoreCase
pour les comparaisons votre valeur par défaut pour la correspondance de chaînes indépendante de la culture.StringComparison.OrdinalIgnoreCase
comparaisons pour une vitesse accrue.StringComparison.CurrentCulture-based
des opérations de chaîne lors de l'affichage de la sortie à l'utilisateur.StringComparison.Ordinal
ouStringComparison.OrdinalIgnoreCase
lorsque la comparaison estlinguistiquement non pertinente (symbolique, par exemple).
ToUpperInvariant
plutôt queToLowerInvariant
lors de la normalisation des chaînes pour la comparaison.À ne pas faire
StringComparison.InvariantCulture
desopérations de chaîne basées sur la plupart des cas; l'une des rares exceptions serait la
persistance de données linguistiquement significatives mais culturellement agnostiques.
Sur la base de ces règles, vous devez utiliser:
tandis que [YourDecision] dépend des recommandations ci-dessus.
lien de la source: http://msdn.microsoft.com/en-us/library/ms973919.aspx
la source
Ce sont les solutions les plus simples.
Par indice de
En changeant de cas
Par Regex
la source
Je sais que ce n'est pas le C #, mais dans le framework (VB.NET) il y a déjà une telle fonction
Variante C #:
la source
La
InStr
méthode de l'assembly VisualBasic est la meilleure si vous avez un problème d'internationalisation (ou si vous pouvez la réimplémenter). En y regardant, dotNeetPeek montre que non seulement il tient compte des majuscules et des minuscules, mais aussi du type kana et des caractères pleine vs demi-largeur (surtout pertinent pour les langues asiatiques, bien qu'il existe aussi des versions pleine largeur de l'alphabet romain ). Je saute quelques détails, mais consultez la méthode privéeInternalInStrText
:la source
Juste comme ça:
la source
Utilisez ceci:
la source
Contains
pasCompare
.Contains
en œuvre avecIndexOf
. Cette approche est donc tout aussi utile! L'exemple de code C # sur cette page utilise string.Compare (). C'est le choix de l'équipe SharePoint!C'est assez similaire à un autre exemple ici, mais j'ai décidé de simplifier enum en bool, primaire car d'autres alternatives ne sont normalement pas nécessaires. Voici mon exemple:
Et l'utilisation est quelque chose comme:
la source
L'utilisation d'un RegEx est un moyen simple de le faire:
la source
Juste pour construire sur la réponse ici, vous pouvez créer une méthode d'extension de chaîne pour la rendre un peu plus conviviale:
la source
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
plutôt.si vous voulez vérifier si votre chaîne passée est dans la chaîne, il existe une méthode simple pour cela.
Cette valeur booléenne sera renvoyée si la chaîne est contenue ou non
la source
Aussi simple et fonctionne
la source
la source
Vous pouvez utiliser la
string.indexof ()
fonction. Ce sera insensible à la cassela source
L'astuce ici est de rechercher la chaîne, en ignorant la casse, mais de la garder exactement la même (avec le même cas).
La sortie est "Reset"
la source
la source
Un moyen simple pour les débutants:
la source