Как проверить, содержит ли строка какой-либо элемент, присутствующий в массиве строк
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));