【问题标题】:String contains another two strings字符串包含另外两个字符串
【发布时间】:2013-04-08 21:09:37
【问题描述】:

如果字符串包含 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 的最简单方法是什么?

【问题讨论】:

  • if(d.Contains(a) && d.Contains(b))
  • 您应该将 Console.ReadLine() 保留在 if 循环之外。
  • 您将字符串ba 连接起来,因此您实际上是在编写if(d.Contains("someonedamage")),但这是行不通的。您的 if 语句失败,因此不会命中 Console.ReadLine()。说真的,这是非常基本调试,请学习如何逐步调试代码。
  • 这确实是你应该自己调试的东西。你会得到大量的答案来告诉你为什么这是不正确的,但是简单地放置几个断点并跟踪代码,查看值,对于你作为程序员来说比这里泛滥的所有答案更有益.
  • @WonkotheSane:同意。我很高兴我在学习编程时没有 SO(或互联网)。如果某些事情不起作用,我必须自己解决。我不能只是发布代码并让一群人告诉我如何修复它。这是一项重要的技能。

标签: c# string contains


【解决方案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 部分。

【讨论】:

  • 嗯,为什么数字不在每行的第 5 位?
  • 如果不在同一个地方,那就不行了。你会想要做一个正则表达式。 \d* 将为您获取字符串中的所有数字,这将适用于您上面的示例。
【解决方案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 即“someonedamage”

    【讨论】:

      【解决方案4】:

      您是在寻找包含一定数量单词还是包含特定单词的字符串?您的示例导致后者。

      在这种情况下,您可能希望研究解析字符串或至少使用正则表达式。
      学习正则表达式——它将在编程中有用 1000 倍。我不能过分强调这一点。使用 contains 和 if 语句将很快变成一团糟。

      如果你只是想数单词,那么:

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

      【讨论】:

        【解决方案5】:

        使用代码d.Contains(b + a) 检查“You hit someone for 50 damage”是否包含“someonedamage”。而这个(我猜)你不想要。

        + 连接 b 和 a 的两个字符串。

        你必须检查它

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

        【讨论】:

          【解决方案6】:

          这是因为d 确实 包含b + a(即"someonedamage"),因此应用程序刚刚终止(因为您的Console.ReadLine();if 块内)。

          【讨论】:

            【解决方案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】:

                如果你有一个单词列表,你可以这样做:

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

                【讨论】:

                  【解决方案10】:

                  你可以用 linq 写一个扩展方法。

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

                  编辑(感谢 sirid):

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

                  【讨论】:

                  • Cast&lt;string&gt;() 是不必要的。您还可以组合 Where()Any(),因为 Any() 可以采用过滤器参数。
                  【解决方案11】:

                  因为b + a ="someonedamage",试试这个实现:

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

                  【讨论】:

                    【解决方案12】:

                    所以你想知道一个字符串是否包含另外两个字符串?

                    您可以使用此扩展程序,它还允许指定比较:

                    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);
                    

                    【讨论】:

                      【解决方案13】:

                      我刚刚检查了 contains 中的空格以检查字符串是否包含 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.Format

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

                        通过这种方式,您可以拥有您正在寻找的伤害限定符,并且能够为其他部分计算该伤害限定符。

                        【讨论】:

                          【解决方案15】:
                          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");
                          }
                          

                          【讨论】:

                            【解决方案16】:
                                public static bool In(this string str, params string[] p)
                                {
                                    foreach (var s in p)
                                    {
                                        if (str.Contains(s)) return true;
                                    }
                                    return false;
                                }
                            

                            【讨论】:

                            • 一个人通常应该在自己的答案中添加一些解释性的话。
                            【解决方案17】:
                             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));
                                      }
                                   }
                            

                            【讨论】:

                              猜你喜欢
                              • 2011-08-31
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2013-11-26
                              • 1970-01-01
                              • 1970-01-01
                              • 2013-03-13
                              • 1970-01-01
                              相关资源
                              最近更新 更多