关于C#:如何检查字符串是否包含字符串数组中存在的任何元素

How to check whether string contains any element present in the string array

1
2
string str ="cat:fox";
string[] strArr = new string[] {"cat","dog" };

我有一根像EDOCX1[0]的绳子。我需要检查该字符串是否包含strArr中存在的任何元素,就像"cat"或"dog"一样。

如果字符串是"cat:fox"方法,则应返回true。如果字符串是"dog:fox"方法,则返回true。

我尝试的是:

1
2
3
4
5
6
7
8
9
10
11
string[] split = str.Split(':');
blnReturn = false;

foreach (var item in split)
{
  foreach(var item1 in strArr)
  {
    if(item == item1)
       blnReturn = true;
  }
}

注意:这意味着值与冒号相连。我需要检查该字符串是否包含strarr中存在的任何值。

如何做得更好?

更新

要求是如果str是str ="cat dfgfg:fox";,则不应返回true。只有猫。

否则我们可以这样检查strData = str.Split(':');。斯特拉尔已经在那里了。

条件是strarr(字符串数组)中的任何一个数据都应与strdata(字符串数组)匹配。然后它应该返回真的。


看起来你可以用Enumerable.Any的方法;

1
2
3
4
5
6
7
string str ="cat:dog";
string[] strArr = new string[] {"cat","dog" };

if (strArr.Any(str.Contains))
{
  // Your string contains one the array values
}

当然,这也适用于catscatsscat:asdasd:dog,因为Contains的定义。

你没有提到,但是如果你不想匹配像cat:asdasd dog这样的字符串,可以看看马克·格雷威尔的答案,它看起来是正确的。


在大多数情况下,您发布的代码都很好。如果您需要最小化分配(因为它是一个紧密的循环),那么不希望Split,您可以使用如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static bool ContainsToken(string value, string token, char delimiter = ';')
{
    if (string.IsNullOrEmpty(token)) return false;
    if (string.IsNullOrEmpty(value)) return false;

    int lastIndex = -1, idx, endIndex = value.Length - token.Length, tokenLength = token.Length;
    while ((idx = value.IndexOf(token, lastIndex + 1)) > lastIndex)
    {
        lastIndex = idx;
        if ((idx == 0 || (value[idx - 1] == delimiter))
            && (idx == endIndex || (value[idx + tokenLength] == delimiter)))
        {
            return true;
        }
    }
    return false;
}

然后是:

1
2
3
4
5
6
7
8
static bool ContainsAnyOf(string value, string values)
{
    for(int i = 0 ; i < strArr.Length; i++)
    {
        if(ContainsToken(values, value, ':')) return true;
    }
    return false;
}


如果你想区分"猫"和"猫",最好是:

1
2
3
4
bool Match(string str, string[] strArr)
{
    return strArr.Intersect(str.Split(':')).Any();
}


1
2
3
4
var str ="cat:fox";
var strArr = new[] {"cat","dog" };

var result = strArr.ToList().Where(str.Contains);

result的第一个元素将包含"cat"


你的尝试是正确的!

不过,如果您有一个由:分隔的非常大的字符串,并且您希望经常执行查找操作,那么您可以使用字典,因为它的Contains方法是o(1),所以速度非常快!

1
2
3
var dictionary=str.Split(new char[]{':'})
                  .ToDictionary(x=>x,x=>"");
bool contains=strArr.Any(x=>dictionary.ContainsKey(x));//fast ops

您还可以使用列表而不是数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
string str ="cat:fox";
List<String> animallist = new List<String>();

animallist.add("cat");
animallist.add("dog");

//Now you can check like

if(animallist.Contains("cat")){

   //do something

}


这样应该可以做到,您不必拆分原始字符串并创建一个双循环:

1
2
3
4
foreach(string s in array)
    if(word.Contains(s))
        return true;
return false;

在一种方法中:

1
2
3
4
5
6
7
8
9
10
public bool ContainsItem(string word, string[] array)
{
    foreach(string s in array)
        if(word.Contains(s))
            return true;                
    return false;
}

//Usage:
var result = ContainsItem(str, strArr);

也可以使用Enumerable Any()方法:

1
var result = strArr.Any(s => str.Contains(s));

您可以使用LINQ:

1
bool contains = strArr.Any(pattern => str.Contains(pattern));