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

我有一个像str. 我需要检查该字符串是否包含存在于strArr“猫”或“狗”中的任何元素。

如果字符串是“cat:fox”方法应该返回true。如果字符串是“dog:fox”方法应该返回true。

我试过的是:

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 已经存在。

条件是strArr(字符串数组)中的任何一个数据都应该与strData(字符串数组)匹配,那么它应该返回true。

4

8 回答 8

3

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

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

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

当然,这也有效catscatss并且cat:asdasd:dog因为Contains定义。

您没有提到,但如果您不想匹配字符串,cat:asdasd dog请查看Marc Gravell 的答案,它看起来是正确的。

于 2013-11-12T08:05:23.933 回答
2

如果你想区分“猫”和“猫”,你最好这样做:

bool Match(string str, string[] strArr)
{
    return strArr.Intersect(str.Split(':')).Any();
}
于 2013-11-12T08:07:40.883 回答
2

在大多数情况下,您发布的代码都很好。如果您需要最小化分配(因为它是一个紧密的循环),所以不想这样做Split,您可以使用类似的东西:

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

然后是这样的:

static bool ContainsAnyOf(string value, string values)
{
    for(int i = 0 ; i < strArr.Length; i++)
    {
        if(ContainsToken(values, value, ':')) return true;
    }
    return false;
}
于 2013-11-12T08:11:35.507 回答
0

您可以使用 LINQ:

bool contains = strArr.Any(pattern => str.Contains(pattern));
于 2013-11-12T08:06:29.220 回答
0

这应该可以解决问题,您不必拆分原始字符串并创建双循环:

foreach(string s in array)
    if(word.Contains(s))
        return true;
return false;

在一个方法中:

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()方法:

var result = strArr.Any(s => str.Contains(s));
于 2013-11-12T08:09:53.040 回答
0

您也可以使用 List 而不是 Array:

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

}
于 2013-11-12T08:10:16.383 回答
0

你的尝试是正确的!


虽然如果你有一个非常大的字符串,:并且你想非常频繁地执行查找操作,你可以使用字典,因为它的Contains方法是 O(1),所以非常快!

var dictionary=str.Split(new char[]{':'})
                  .ToDictionary(x=>x,x=>"");
bool contains=strArr.Any(x=>dictionary.ContainsKey(x));//fast ops
于 2013-11-12T08:11:31.430 回答
0
var str = "cat:fox";
var strArr = new[] { "cat", "dog" };

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

的第一个元素result将包含“猫”

于 2013-11-12T08:31:06.313 回答