2016-10-19 4 views
2

У меня есть следующий код, который работает лакомство -Проверьте слова строки присутствует в списке строк

List<string> test = new List<string>(); 
test.Add("cat"); 

if (test.Any(str => str.Contains("cat"))) 
{ 
     // do something 
}; 

Однако есть способ проверить, если нет точного совпадения, например -

if (test.Any(str => str.Contains("the cat sat"))) 
{ 
     // do something 
}; 

Я хочу, чтобы иметь возможность проверить, если любой из слов в строке присутствуют в списке. Как я могу это достичь?

+1

Дополнительная Подсказка: Если вы тестируете только для 'Contains', используйте' HashSet <> 'вместо 'List <>' - это намного быстрее, когда у вас много данных. –

ответ

5

Вы должны извлечь слова и проверить наличие их в элементах test

var data = "the cat sat"; 
var words = data.Split(null); 
if (test.Any(str => words.Any(word => str.Contains(word))) 
{ 
    // do something 
} 

Если вы хотите, чтобы проверить точное соответствие, вы должны использовать word => str == word.

"a cat".Contains("cat") //true 
"a cat" == "cat" //false 
4

Вы можете просто сделать, таким образом

string check = "the cat sat"; 
if(test.Any(str => check.Split(' ').Contains(str))) 
{ 
     // present 
}; 
4

Split ваше предложение в разные слова:

var words = new HashSet<string>("the cat sat".Split(' ')); 

И тогда вы можете:

  1. Проверьте, что коллекция содержит любой из str с:

    var test = new List<string> { "cat" }; 
    var words = new HashSet<string>("the cat sat".Split(' ')); 
    
    var result = test.Any(str => words.Contains(str)); // In this case "true" 
    
  2. Использование Intersect:

    var test = new List<string> { "cat" }; 
    var words = new HashSet<string>("the cat sat".Split(' ')); 
    
    var result = test.Intersect(words).Any(); 
    

Использование HashSet так, когда вы идете через 2 коллекции она будет в o(n) и не o(n)2

Если у вас нет точных совпадений в списке test, как в следующем примере:

var test = new List<string> { "some cat" }; 

Затем вы можете сделать что-то вроде этого:

var test = new List<string> { "some cat" }; 
var words = "the cat sat".Split(' ').ToList(); 

var result = words.Any(word => test.Any(item => item.Contains(word))); 
2

Одним из способов достижения этой цели было бы использовать расширение на string объекта.

public static bool Contains(this string input, bool caseSensitive, params string[] items) 
{ 
    input = !caseSensitive ? input.ToLower() : input; 

    foreach (var item in items) 
    { 
     if (input.Contains(!caseSensitive ? item.ToLower() : item)) 
      return true; 
    } 

    return false; 
} 

Ваша следующая строка будет тогда работать с небольшим изменением:

if (test.Any(str => str.Contains(true, "the", "cat", "sat"))) // true for case sensitive contains 
{ 
     // do something 
}; 
1
bool contains = false;   
string checkString = "the cat sat"; 
checkString.Split(' ').ToList().Foreach(x => { 
    if (test.Any(str => str.Contains(x)) && !contains) 
    { 
     // do something 
     contains = true; 
    }; 
}); 
Смежные вопросы