Строка содержит еще две строки
Возможно ли найти функцию сложения, если строка содержит 2 слова или более? Это то, что я пытаюсь сделать:
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();
}
Когда я запускаю это, консольное окно просто отключается очень быстро, не показывая ничего.
И еще один вопрос: если я хочу добавить, сколько урона сделано, что будет самым простым способом получить это число и получить его в TryParse
?
Ответы
Ответ 1
Вам было бы лучше просто вызвать Contains
дважды или сделать свой собственный метод расширения, чтобы справиться с этим.
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();
}
Что касается вашего другого вопроса, вы можете создать регулярное выражение для синтаксического анализа строки, чтобы найти 50, или если строка всегда одна и та же, просто разделите ее на основе пространства и получите 5-ю часть.
Ответ 2
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");
}
Ответ 3
Это потому, что операторы if возвращают false, так как d не содержит b + a ie "someonedamage"
Ответ 4
Вы ищете строку, содержащую определенное количество слов или содержащую определенные слова? Ваш пример ведет к последнему.
В этом случае вам может потребоваться изучить строки синтаксического анализа или, по крайней мере, использовать регулярное выражение.
Изучите регулярное выражение - он будет полезен 1000 раз в программировании. Я не могу этого особо подчеркнуть. Использование содержит и если утверждения будут превращаться в беспорядок очень быстро.
Если вы просто пытаетесь подсчитать слова, тогда:
string d = "You hit someone for 50 damage";
string[] words = d.Split(' '); // Break up the string into words
Console.Write(words.Length);
Ответ 5
Это связано с тем, что d
не содержит b + a
(т. "someonedamage"
), и поэтому приложение просто заканчивается (поскольку ваш Console.ReadLine();
находится в блоке if
).
Ответ 6
Поскольку b + a ="someonedamage"
, попробуйте это:
if (d.Contains(b) && d.Contains(a))
{
Console.WriteLine(" " + d);
Console.ReadLine();
}
Ответ 7
Ваш b + a
равен "someonedamage"
, так как ваш d
не содержит эту строку, оператор if
возвращает false
и не запускает следующие части.
Console.WriteLine(" " + d);
Console.ReadLine();
Вы можете управлять этим более эффективным;
bool b = d.Contains(a) && d.Contains(b);
Вот DEMO
.
Ответ 8
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();
Ответ 9
С кодом d.Contains(b + a)
вы проверяете, есть ли "Вы ударили кого-то за 50 урона", содержит "someonedamage". И это (я думаю), что вы не хотите.
+ Конкатцирует две строки из b и a.
Вы должны проверить это
if(d.Contains(b) && d.Contains(a))
Ответ 10
Итак, вы хотите знать, содержит ли одна строка две другие строки?
Вы можете использовать это расширение, которое также позволяет указать сравнение:
public static bool ContainsAll(this string text, StringComparison comparison = StringComparison.CurrentCulture, params string[]parts)
{
return parts.All(p => text.IndexOf(p, comparison) > -1);
}
Используйте его таким образом (вы также можете опустить StringComparison
):
bool containsAll = d.ContainsAll(StringComparison.OrdinalIgnoreCase, a, b);
Ответ 11
Если у вас есть список слов, вы можете сделать такой метод:
public bool ContainWords(List<string> wordList, string text)
{
foreach(string currentWord in wordList)
if(!text.Contains(currentWord))
return false;
return true;
}
Ответ 12
Вы можете написать метод расширения с помощью linq.
public static bool MyContains(this string str, params string[] p) {
return !p.Cast<string>().Where(s => !str.Contains(s)).Any();
}
EDIT (спасибо to sirid):
public static bool MyContains(this string str, params string[] p) {
return !p.Any(s => !str.Contains(s));
}
Ответ 13
Я просто проверил, содержит ли пробел, чтобы проверить, имеет ли строка 2 или более слова.
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();
Ответ 14
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");
}
Ответ 15
Так что же вы на самом деле после? Если вы хотите убедиться, что что-то попало за ущерб (в данном случае), почему вы не используете string.Format
string a = string.Format("You hit someone for {d} damage", damage);
Таким образом, у вас есть возможность получить квалификатор повреждений, который вы ищете, и можете рассчитать это для других частей.
Ответ 16
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 convinience
internal static class Extensiones {
public static Boolean ContainsAll(this String str, StringComparison comparisonType, params String[] values) {
return values.All(s => s.Equals(s, comparisonType));
}
}
Ответ 17
public static bool In(this string str, params string[] p)
{
foreach (var s in p)
{
if (str.Contains(s)) return true;
}
return false;
}