J'ai une liste testList
qui contient un tas de chaînes. Je voudrais ajouter une nouvelle chaîne dans le testList
uniquement si elle n'existe pas déjà dans la liste. Par conséquent, je dois effectuer une recherche insensible à la casse dans la liste et la rendre efficace. Je ne peux pas utiliser Contains
car cela ne prend pas en compte le boîtier. Je ne veux pas non plus utiliser ToUpper/ToLower
pour des raisons de performances. Je suis tombé sur cette méthode, qui fonctionne:
if(testList.FindAll(x => x.IndexOf(keyword,
StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
Console.WriteLine("Found in list");
Cela fonctionne, mais cela correspond également à des mots partiels. Si la liste contient «chèvre», je ne peux pas ajouter «avoine» car il prétend que «avoine» est déjà dans la liste. Existe-t-il un moyen de rechercher efficacement des listes sans tenir compte de la casse, où les mots doivent correspondre exactement? Merci
List<>.Exists(Predicate<>)
méthode d'instance. Notez également que si la liste contient desnull
entrées, cela peut exploser. Dans ce cas, il est plus sûr de direkeyword.Equals(x, StringComparison.OrdinalIgnoreCase)
quex.Equals(keyword, StringComparison.OrdinalIgnoreCase)
(si vous pouvez garantir que lekeyword
n'est jamais nul).Je me rends compte que c'est un ancien article, mais juste au cas où quelqu'un d'autre le chercherait, vous pouvez l' utiliser
Contains
en fournissant le comparateur d'égalité de chaîne insensible à la casse comme ceci:Cela est disponible depuis .net 2.0 selon msdn .
la source
StringComparer
classe existe depuis 2.0, mais cette surcharge de Contains a été introduite dans 3.5. msdn.microsoft.com/en-us/library/bb339118(v=vs.110).aspxBasé sur la réponse d'Adam Sills ci-dessus - voici une belle méthode d'extensions propres pour Contains ... :)
la source
Vous pouvez utiliser StringComparer:
la source
Basé sur la réponse de Lance Larsen - voici une méthode d'extension avec la chaîne recommandée.Compare au lieu de string.
la source
Vous vérifiez si le résultat de IndexOf est supérieur ou égal à 0, ce qui signifie si la correspondance commence n'importe où dans la chaîne. Essayez de vérifier s'il est égal à 0:
Désormais, «chèvre» et «avoine» ne correspondent pas, mais «chèvre» et «goa» le seront. Pour éviter cela, vous pouvez comparer les longueurs des deux chaînes.
Pour éviter toute cette complication, vous pouvez utiliser un dictionnaire au lieu d'une liste. La clé serait la chaîne minuscule et la valeur la chaîne réelle. De cette façon, les performances ne sont pas affectées car vous n'avez pas à utiliser
ToLower
pour chaque comparaison, mais vous pouvez toujours l'utiliserContains
.la source
Voici l'exemple de recherche d'un mot-clé dans toute la liste et de suppression de cet élément:
Si vous souhaitez supprimer un livre contenant un mot clé dans la propriété Text, vous pouvez créer une liste de mots clés et le supprimer de la liste des livres:
la source
J'ai eu un problème similaire, j'avais besoin de l'index de l'élément mais il devait être insensible à la casse, j'ai regardé sur le Web pendant quelques minutes et je n'ai rien trouvé, alors j'ai juste écrit une petite méthode pour le faire, voici ce que j'ai fait:
Ajoutez ce code au même fichier et appelez-le comme ceci:
En espérant que ça aide, bonne chance!
la source