Как проверить, содержит ли строка какой-либо элемент, присутствующий в массиве строк

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 = "cat dfgfg:fox"; Это не должно возвращать истину. Только это должен быть кот.

В противном случае мы можем проверить этот путь strData = str.Split(':'); и strArr уже там.

Условие - любые данные в strArr (строковый массив) должны совпадать с strData (строковый массив), тогда они должны возвращать true.

8 ответов

Решение

Если вы хотите провести различие между "кошкой" и "кошкой", вам лучше сделать:

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

Похоже, вы можете использовать Enumerable.Any метод как;

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

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

Конечно, это работает также cats, catss а также cat:asdasd:dog из-за Contains определение.

Вы не упомянули, но если вы не хотите совпадать со строкой, как cat:asdasd dog проверьте ответ Марка Гравелла, который выглядит правильным.

В большинстве случаев код, который вы публикуете, в порядке. Если вам нужно минимизировать распределение (потому что это жесткий цикл), поэтому не хотите 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;
}

Ваша попытка верна!


Хотя, если у вас есть очень большая строка, разделенная : и вы хотите выполнять операции поиска довольно часто, вы можете использовать словарь, так как это Contains Метод O(1) и поэтому очень быстрый!

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

Вы можете использовать LINQ:

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

Вы также можете использовать 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

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

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

Первый элемент result будет содержать "кот"

Это должно сработать, вам не нужно разбивать исходную строку и создавать двойной цикл:

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));
Другие вопросы по тегам