【问题标题】:Check if words of a string is present in a string list检查字符串的单词是否存在于字符串列表中
【发布时间】:2017-02-28 19:30:00
【问题描述】:

我有以下代码可以很好地解决 -

List<string> test = new List<string>();
test.Add("cat");

if (test.Any(str => str.Contains("cat")))
{
      // do something
};

但是有一种方法可以检查是否存在不完全匹配的例子 -

if (test.Any(str => str.Contains("the cat sat")))
{
      // do something
};

我希望能够检查字符串中的 any 单词是否存在于列表中。我怎样才能做到这一点?

【问题讨论】:

  • 附加提示:如果您只测试Contains,请使用HashSet&lt;&gt; 而不是List&lt;&gt; - 当您拥有大量数据时速度会快很多。

标签: c# string linq list contains


【解决方案1】:

您应该提取单词并检查它们是否存在于test 的元素中

var data = "the cat sat";
var words = data.Split(null);
if (test.Any(str => words.Any(word => str.Contains(word)))
{
  // do something
}

如果你想检查完全匹配,你应该使用word =&gt; str == word

"a cat".Contains("cat") //true
"a cat" == "cat" //false

【讨论】:

    【解决方案2】:

    Split你的句子变成了不同的单词:

    var words = new HashSet<string>("the cat sat".Split(' '));
    

    然后你可以:

    1. 检查该集合是否包含任何strs:

      var test = new List<string> { "cat" };
      var words = new HashSet<string>("the cat sat".Split(' '));
      
      var result =  test.Any(str => words.Contains(str)); // In this case "true"
      
    2. 使用Intersect

      var test = new List<string> { "cat" };
      var words = new HashSet<string>("the cat sat".Split(' '));
      
      var result = test.Intersect(words).Any();
      

    HashSet 的使用是这样的,当您浏览 2 个集合时,它会出现在 o(n) 而不是 o(n)2

    如果您在test 列表中没有完全匹配,如下例所示:

    var test = new List<string> { "some cat" };
    

    然后你可以这样做:

    var test = new List<string> { "some cat" };
    var words = "the cat sat".Split(' ').ToList();
    
    var result = words.Any(word => test.Any(item => item.Contains(word)));
    

    【讨论】:

      【解决方案3】:

      这样就可以了

      string check = "the cat sat";
      if(test.Any(str => check.Split(' ').Contains(str)))
      {
            // present
      };
      

      【讨论】:

        【解决方案4】:

        实现此目的的一种方法是使用string 对象的扩展。

        public static bool Contains(this string input, bool caseSensitive, params string[] items)
        {
            input = !caseSensitive ? input.ToLower() : input;
        
            foreach (var item in items)
            {
                if (input.Contains(!caseSensitive ? item.ToLower() : item))
                    return true;
            }
        
            return false;
        }
        

        您的以下行也可以进行微小的更改:

        if (test.Any(str => str.Contains(true, "the", "cat", "sat"))) // true for case sensitive contains
        {
              // do something
        };
        

        【讨论】:

          【解决方案5】:
          bool contains = false;        
          string checkString = "the cat sat";
          checkString.Split(' ').ToList().Foreach(x => {
            if (test.Any(str => str.Contains(x)) && !contains)
            {
                // do something
                contains = true;
            };
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-24
            • 2013-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-29
            • 1970-01-01
            相关资源
            最近更新 更多