Строка содержит еще две строки

Возможно ли найти функцию сложения, если строка содержит 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;
    }