11
votes

Comment utiliser StringComParison pour les chaînes en C #?

string body = Selenium.GetBodyText();

if (body.Contains("software", StringComparison.CurrentCultureIgnoreCase))
{
   //do something
}
I get a string does not contain a definition for Contains message when I do the above. What am I doing wrong here? Thanks in advance everyone!I am trying to check if body has the string "software", "Software" or "SOFTWARE". body will contain paragraphs and paragraphs of text (string). 

2 commentaires

Vous avez un corps de cordes, puis utilisez Bodytext, s'il n'est pas une faute de frappe, la déclaration de BodyText


Oups ... Désolé ... c'est une erreur. Laissez-moi le réparer rapidement


10 Réponses :


7
votes

Je ne sais pas si vous utilisez .NET 1.1, mais il n'a pas contenu la méthode contient . Vous devez utiliser indexof . .NET 2.0 Ajout de la méthode contient (par msdn) . Avec index de, vous pouvez utiliser StringComparison .


0 commentaires

12
votes

Je ne crois pas string code> a une surcharge de contient code> prendre un stringcomparison code>. Cependant, vous pouvez utiliser indexofof code> qui fait :

if (body.IndexOf("software", StringComparison.CurrentCultureIgnoreCase) != -1)


7 commentaires

Le message d'erreur ne serait-il pas indiqué qu'il utilise un cadre plus ancien? Il semble que le message d'erreur soit différent si la signature de la méthode était fausse.


@ 0A0D: bon point - il devrait être "Aucune surcharge pour la méthode ne contient de 2 arguments". Je suppose que nous verrons ce que Maya dit :)


@Maya Une autre possibilité serait d'étendre la classe string avec une méthode d'extension à l'aide du code comme ci-dessus. Vous créeriez essentiellement votre propre surcharge.


@Maya: Je suis désolé Maya, j'espère que vous n'êtes pas offensé. C'était censé comme généralité.


Le corps est une corde, et quand je fais du corps.Contains, je vois 3 surcharges - une prenant de char, une autre chaîne de prise et la dernière prenant de charcuterie avec StringComparison. Vous avez raison JON. Merci! Je ne sais pas comment vérifier la version de quel cadre j'utilise.Je vais essayer d'utiliser indexof.


@ 0A0D: C'est bon :) Je ne suis pas offensé. Merci d'essayer de m'aider :)


@Maya: Je ne vois pas les trois surcharges dont vous parlez. Quel est l'IDE? Dans VS 2010, je vois que la norme contient la méthode (String) et une autre en utilisant iEnumerable.



1
votes

Du code qui a été collé, vous déclarez une variable "corps" de chaîne de type et à l'aide d'une autre variable "Bodytext" qui est non déclaré.


0 commentaires

1
votes

chaîne n'a pas de méthode contenant cette signature. Str.contains (chr, stringcomparison), pas str.contains (String, StringComparison) ...


0 commentaires

3
votes

String.Contains Ne prenez qu'un seul paramètre - votre code doit être

bodyText.Contains("software");


0 commentaires

2
votes

contient n'a qu'un seul paramètre - la chaîne qu'il s'agit de comparer. Voulez-vous dire, égale qui prend un stringcomparison ?


0 commentaires

0
votes

Vous pouvez toujours utiliser Contient à condition que vous le comparez après la conversion en même cas (supérieur ou inférieur)

par exemple: xxx


3 commentaires

Pas une bonne idée, en raison de la façon dont certaines cultures gérent le boîtier supérieur. Par exemple, "mail" .toupper (). Contient ("Mail") peut ne pas retourner vrai.


merci skeet.didn pense. Pourquoi ne pas convertir l'argument aussi en majuscule et en comparant. ("Samplestring" .ttoupper (). Contient ("Samplestring" .ttoupper ()))


Je ne suis même pas sûr de savoir si cela fonctionnera. Fondamentalement, effectuer une correspondance insensible à une casse idéale ne devrait pas impliquer la conversion, à ce jour au courant.



5
votes

Vous pouvez utiliser une expression régulière pour correspondre à une recherche de chaîne dans C #. Vous avez également la possibilité d'ignorer l'affaire. xxx

Ce lien peut être utile: Comment: Cordures de recherche utilisant des expressions régulières (Guide de programmation C #)


0 commentaires

1
votes

Eh bien, vous pouvez toujours faire une méthode d'extension (si vous utilisez .NET 3.5 ou plus):

public static class StringExtensions
{
    /// <summary>
    /// Returns a value indicating whether the specified String object 
    /// occurs within this string.
    /// </summary>
    /// <param name="str">string object being extended</param>
    /// <param name="value">string object to check for</param>
    /// <param name="comparer">StringComparer to use</param>
    public static bool Contains(this string str, string value, StringComparer comparer)
    {
        StringComparison comparison;
        if (comparer == StringComparer.CurrentCulture)
            comparison = StringComparison.CurrentCulture;
        else if (comparer == StringComparer.CurrentCultureIgnoreCase)
            comparison = StringComparison.CurrentCultureIgnoreCase;
        else if (comparer == StringComparer.InvariantCulture)
            comparison = StringComparison.InvariantCulture;
        else if (comparer == StringComparer.InvariantCultureIgnoreCase)
            comparison = StringComparison.InvariantCultureIgnoreCase;
        else if (comparer == StringComparer.Ordinal)
            comparison = StringComparison.Ordinal;
        else if (comparer == StringComparer.OrdinalIgnoreCase)
            comparison = StringComparison.OrdinalIgnoreCase;
        else
            comparison = StringComparison.Ordinal;

        if (str.IndexOf(value, comparison) != -1)
            return true;
        else
            return false;
    }
}


0 commentaires

0
votes

Je suis très tard à cette fête, mais j'espère que je peux sauver quelqu'un du trou que j'étais juste dans.

avec .NET CORE 2.1 Surcharge Comparer (String, StringComparison) a été mis à disposition. Dès cette écriture, si vous utilisez .NET Framework ou une version antérieure de Core, vous devrez utiliser une solution différente de gisement ici.

GRIP: MSFT pourrait garder le sélecteur de cadre à un endroit sur le page Documents API ? Utilisé pour être haut et centre et le "s'applique à" est très trompeur.


0 commentaires