web-dev-qa-db-fra.com

String contient encore deux chaînes

Est-il possible que la fonction contient trouve si la chaîne contient 2 mots ou plus? C'est ce que j'essaie de faire:

string d = "You hit someone for 50 damage";
string a = "damage";
string b = "someone";
string c = "you";

if(d.Contains(b + a))
{   
    Console.WriteLine(" " + d);
    Console.ReadLine();
}

Lorsque je lance ceci, la fenêtre de la console s’éteint très rapidement sans rien afficher.

Et une autre question: si je veux ajouter le dommage causé, quel serait le moyen le plus simple d’obtenir ce nombre et de le placer dans une TryParse?

14
Winkz

Vous feriez mieux d'appeler Contains deux fois ou de créer votre propre méthode d'extension pour gérer cela.

string d = "You hit someone for 50 damage";
string a = "damage";
string b = "someone";
string c = "you";

if(d.Contains(a) && d.Contains(b))
{
   Console.WriteLine(" " + d);
   Console.ReadLine();
}

En ce qui concerne votre autre question, vous pouvez créer une expression régulière pour analyser la chaîne et en rechercher 50, ou si la chaîne est toujours la même, divisez-la en fonction d'un espace et obtenez la cinquième partie.

39
Brian Dishaw
public static class StringExtensions
{
    public static bool Contains(this string s, params string[] predicates)
    {
        return predicates.All(s.Contains);
    }
}

string d = "You hit someone for 50 damage";
string a = "damage";
string b = "someone";
string c = "you";

if (d.Contains(a, b))
{
    Console.WriteLine("d contains a and b");
}
8
Romoku

En effet, les instructions if retournent false car d ne contient pas b + a i.e "someonedamage"

6
Tralli

Recherchez-vous la chaîne contient un certain nombre de mots ou contient des mots spécifiques? Votre exemple mène vers ce dernier.

Dans ce cas, vous souhaiterez peut-être analyser des chaînes ou au moins utiliser regex.
Apprenez regex - il sera utile de 1000x plus en programmation. Je ne peux pas trop insister sur cela. En utilisant contient et si les déclarations vont se transformer en désordre très rapidement. 

Si vous essayez simplement de compter les mots, alors:

string d = "You hit someone for 50 damage";  
string[] words = d.Split(' ');  // Break up the string into words
Console.Write(words.Length);  
3
marceljg

En effet, d contient pas contient b + a (c.-à-d. "someonedamage"), et par conséquent l'application se termine simplement (puisque votre Console.ReadLine(); est dans le bloc if.

1
Richard Everett

Parce que b + a ="someonedamage", essayez ceci pour atteindre:

if (d.Contains(b) && d.Contains(a))
{  
    Console.WriteLine(" " + d);
    Console.ReadLine();
}
1
Arshad

Votre b + a est égal à "someonedamage", puisque votre d ne contient pas cette chaîne, votre instruction if renvoie false et ne lance pas les parties suivantes. 

Console.WriteLine(" " + d);
Console.ReadLine();

Vous pouvez contrôler cela plus efficacement comme;

bool b = d.Contains(a) && d.Contains(b);

Voici une DEMO .

1
Soner Gönül
string d = "You hit someone for 50 damage";
string a = "damage";
string b = "someone";
string c = "you";

if(d.Contains(a) && d.Contains(b))
{
    Console.WriteLine(" " + d);
}
Console.ReadLine();
1
Rik

Avec le code d.Contains(b + a), vous vérifiez si "Vous infligez 50 dégâts à quelqu'un" contient "une erreur". Et ceci (je suppose) que vous ne voulez pas. 

Le + concats les deux chaînes de b et a. 

Vous devez vérifier par

if(d.Contains(b) && d.Contains(a))
1
Tomtom

Donc, vous voulez savoir si une chaîne contient deux autres chaînes? 

Vous pouvez utiliser cette extension qui permet également de spécifier la comparaison:

public static bool ContainsAll(this string text, StringComparison comparison = StringComparison.CurrentCulture, params string[]parts)
{
    return parts.All(p => text.IndexOf(p, comparison) > -1);
}

Utilisez-le de cette manière (vous pouvez également omettre la StringComparison):

bool containsAll = d.ContainsAll(StringComparison.OrdinalIgnoreCase, a, b);
1
Rango

Si vous avez une liste de mots, vous pouvez utiliser une méthode comme celle-ci:

public bool ContainWords(List<string> wordList, string text)
{
   foreach(string currentWord in wordList)
      if(!text.Contains(currentWord))
         return false;
   return true;
}
1
Conrado Costa

Vous pourriez écrire une méthode d'extension avec linq.

public static bool MyContains(this string str, params string[] p) {
 return !p.Cast<string>().Where(s => !str.Contains(s)).Any();
}

EDIT (merci à sirid):

public static bool MyContains(this string str, params string[] p) {
 return !p.Any(s => !str.Contains(s));
}
1
Serge

Je viens de vérifier un espace dans contient pour vérifier si la chaîne a 2 mots ou plus.

string d = "You hit someone for 50 damage";
string a = "damage";
string b = "someone";
string c = "you";

bool a = ?(d.contains(" ")):true:false;

if(a)
{
 Console.WriteLine(" " + d);
}

Console.Read();
0
SMS
    public static bool In(this string str, params string[] p)
    {
        foreach (var s in p)
        {
            if (str.Contains(s)) return true;
        }
        return false;
    }
0
Rahmi Inevi
 class Program {
          static void Main(String[] args) {
             // By using extension methods
             if ( "Hello world".ContainsAll(StringComparison.CurrentCultureIgnoreCase, "Hello", "world") ) 
                Console.WriteLine("Found everything by using an extension method!");
             else 
                Console.WriteLine("I didn't");

             // By using a single method
             if ( ContainsAll("Hello world", StringComparison.CurrentCultureIgnoreCase, "Hello", "world") )
                Console.WriteLine("Found everything by using an ad hoc procedure!");
             else 
                Console.WriteLine("I didn't");

          }

          private static Boolean ContainsAll(String str, StringComparison comparisonType, params String[] values) {
             return values.All(s => s.Equals(s, comparisonType));
          }    
       }

       // Extension method for your convenience
       internal static class Extensiones {
          public static Boolean ContainsAll(this String str, StringComparison comparisonType, params String[] values) {
             return values.All(s => s.Equals(s, comparisonType));
          }
       }

Alors qu'est-ce que vous êtes vraiment après? Si vous voulez vous assurer que quelque chose a été endommagé (dans ce cas), pourquoi n'utilisez-vous pas string.Format

string a = string.Format("You hit someone for {d} damage", damage);

De cette manière, vous pouvez avoir le qualificatif de dommage que vous recherchez et le calculer pour d’autres pièces. 

0
RWHertenstein2
string d = "You hit ssomeones for 50 damage";
string a = "damage";
string b = "someone";

if (d.Contains(a) && d.Contains(b))
{
    Response.Write(" " + d);

}
else
{
    Response.Write("The required string not contain in d");
}
0
kavitha Reddy