2016-12-14 8 views
0

Я в тупике. Я хотел знать, доступна ли какая-либо комбинация в порядке последовательности строки. как, например, моя строка матчаПоследовательная комбинация строки из строки

string somevar = "rat"; 

тогда, если другая строка содержит «крыса», «в», «ра» или «г», «в», «т» она должна возвращать ложь.

Я могу думать только о создании условий для каждой отдельной последовательности, которую я могу найти вручную. но я уверен, что может быть какой-то трюк, чтобы найти его легко. Я посмотрел на Implement a function that prints all possible combinations of the characters in a string, но он не делает то, что я хочу.

Я сожалею, если это не очень понятно, но я хочу, чтобы проверить состояние, при котором

if(somevar == "rat" || somevar == "at" || somevar == "ra" || somevar == "r" || somevar == "a" || somevar == "t") 
{ 
     \\do something 
} 
+1

Последнее изменение аннулирует предыдущие требования. Вы сказали «содержит» раньше, и теперь вы прямо сравниваете с набором значений. – Sinatr

+0

@Sinatr: Да, это создавало путаницу, поэтому я удалил ее. Я хочу сказать. мое последнее условие должно возвращать false. Извините за все проблемы –

+1

@mybirthname «резко» - мне просто пришлось сменить несколько символов – fubo

ответ

3

Вам нужен метод, который определяет все подстроки

public static IEnumerable<string> GetAllSubStrings(string input, int length) 
{ 
    for (var i = 0; i < input.Length - length + 1; i++) 
    { 
     yield return input.Substring(i, length); 
    } 
} 

, то вы можете просто создать список со всеми комбинациями

string somevar = "rat"; 
List<string> subStrings = new List<string>(); 
for (int i = 0; i < somevar.Length; i++) 
{ 
    subStrings.AddRange(GetAllSubStrings(somevar, i + 1)); 
} 
// subStrings = {"rat", "at", "ra", "r", "a", "t"} 

и, наконец, проверить вашу другую строку на этот список.

UPDATE обновленное Вопрос:

//check "ra" 
string testItem = "ra"; 
bool contains = subStrings.Any(x => testItem == x); 
+1

Спасибо @fubo, это сработало для меня. –

4

Вам не нужно проверять все подстроки, если это достаточно, чтобы один символ содержится:

bool containsAnyChar = somevar.Intersect("rat").Any(); 

Это работает, потому что строка реализует IEnumerable<char> (представляет собой набор символов).

+0

@mybirthname: 'Any' менее эффективен, если строка большая. Это всего лишь цикл, так что O (n), 'Intersect' использует основанную на наборе aproach. Если строка невелика, это не имеет никакого значения. –

+0

@TimSchmelter yes Я тестирую ее вручную с помощью 2 строк с 10 тыс. Символов (1-10 тыс. Номеров и 5 тыс. -15 тыс. Номеров), и разница действительно большая. Я этого не знал, спасибо за это, как я сказал. Я уже поддержал вас – mybirthname

-1
string somevar = "rat"; 
string anotherString = "rat is there"; 
bool result = somevar.ToCharArray().Any(ch => anotherString.Contains(ch));