2012-02-04 4 views
4

я мог бы использовать следующее выражение Linq для подсчета количества вхождений слова следующим образом:Использование linq для подсчета подстрок в строке?

string test = "And And And"; 
int j = test.Split(' ').Count(x => x.Contains("And")); 

Однако если я искал «И И» Есть ли способ использовать LINQ для подсчета слов без использования split. Использует ли какой-либо из этих методов дольше O (n)?

+2

код вы вывесили не компилируется ... Вы имеете в виду 'Int J = test.Split (» «) .Count (х => х == "А"); '? –

+0

Где выражение linq в вашем коде? –

+0

@Peri Метод расширения Count является частью linq данного выражения. – phoog

ответ

5

Вы можете использовать регулярное выражение:

string test = "And And And"; 
int j = Regex.Matches(test, "And").Cast<Match>().Count(); 

BTW, вы хотите, чтобы перекрывающихся вхождений? т. е. если вы ищете «И И», считаете ли вы, что test содержит 1 или 2 его вхождения?

+1

Что такое призы? –

+4

@Peri, это потому, что 'MatchCollection' реализует не-общий« IEnumerable », но не' IEnumerable ', а 'Count' работает только в общей версии. –

+1

Не забудьте избежать специальных символов регулярного выражения, если строка, которую вы ищете, может содержать их. – svick

0

Это не совсем Linq, но вы также можете сделать метод расширения, как показано ниже. Это, вероятно, более эффективным, чем любое решение Linq:

 public static int CountSubStrings(this string input, string delimiter, bool ignoreCase = false) 
    { 
     int instancesNo = 0; 
     int pos = 0; 
     while((pos = input.IndexOf(delimiter, pos, ignoreCase ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture)) != -1) 
     { 
      pos += delimiter.Length; 
      instancesNo++; 
     } 
     return instancesNo; 
    } 
Смежные вопросы