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
?
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.
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");
}
En effet, les instructions if retournent false car d ne contient pas b + a i.e "someonedamage"
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);
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
.
Parce que b + a ="someonedamage"
, essayez ceci pour atteindre:
if (d.Contains(b) && d.Contains(a))
{
Console.WriteLine(" " + d);
Console.ReadLine();
}
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
.
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();
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))
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);
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;
}
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));
}
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();
public static bool In(this string str, params string[] p)
{
foreach (var s in p)
{
if (str.Contains(s)) return true;
}
return false;
}
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.
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");
}