检查字符串的单词是否存在于字符串列表中

Check if words of a string is present in a string list

我有以下代码可以解决问题 -

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

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

你可以简单地通过这种方式

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

您应该提取单词并检查它们在 test

的元素中是否存在
var data = "the cat sat";
var words = data.Split(null);
if (test.Any(str => words.Any(word => str.Contains(word)))
{
  // do something
}

如果你想检查完全匹配你应该使用 word => str == word.

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

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

实现此目的的一种方法是使用 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
};
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;
  };
});