簡體   English   中英

如何檢查字符串是否包含字符串數組中存在的任何元素

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

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

我有一個像str這樣的str 我需要檢查該字符串是否包含strArr存在的任何元素,就像“ cat”或“ dog”一樣。

如果字符串為“ 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。

看起來您可以使用Enumerable.Any方法;

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這樣的字符串,請查看Marc Gravell的答案 ,該答案看起來是正確的。

如果要區分“貓”和“貓”,最好執行以下操作:

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

在大多數情況下,您發布的代碼很好。 如果您需要最小化分配(因為這是一個緊密的循環),所以不想使用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;
}

您可以使用LINQ:

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

這應該可以解決問題,您不必拆分原始字符串並創建一個雙循環:

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

您也可以使用列表而不是數組:

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

}

您的嘗試是正確的!


盡管如果您有一個非常大的字符串,並以:分隔,並且您想經常執行查找操作,則可以使用字典,因為它的Contains方法為O(1),所以速度非常快!

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

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

result第一個元素將包含“ cat”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM