Количество вхождений символа в строке

Я пытаюсь получить количество вхождений определенного символа, такого как & в следующей строке.

string test = "key1=value1&key2=value2&key3=value3";

Как определить, что в приведенной выше тестовой строковой переменной есть 2 амперсанда (&)?

Ответ 1

Вы можете сделать это:

int count = test.Split('&').Length - 1;

Или с LINQ:

test.Count(x => x == '&');

Ответ 2

Потому что LINQ может делать все...:

string test = "key1=value1&key2=value2&key3=value3";
var count = test.Where(x => x == '&').Count();

Или, если хотите, вы можете использовать перегрузку Count, которая берет предикат:

var count = test.Count(x => x == '&');

Ответ 3

Самый прямой и наиболее эффективный - просто пропустить символы в строке:

int cnt = 0;
foreach (char c in test) {
  if (c == '&') cnt++;
}

Вы можете использовать расширения Linq, чтобы сделать более простую и почти эффективную версию. Есть немного больше накладных расходов, но это все еще удивительно близко к циклу в производительности:

int cnt = test.Count(c => c == '&');

Тогда существует старая трюк Replace, однако это лучше подходит для языков, где цикл является неудобным (SQL) или медленным (VBScript):

int cnt = test.Length - test.Replace("&", "").Length;

Ответ 4

Зачем использовать regex для этого. String реализует IEnumerable<char>, поэтому вы можете просто использовать LINQ.

test.Count(c => c == '&')

Ответ 5

Ваш пример строки выглядит как часть строки запроса GET. Если это так, обратите внимание, что HttpContext поможет вам

int numberOfArgs = HttpContext.Current.QueryString.Count;

Подробнее о том, что вы можете делать с QueryString, см. NameValueCollection

Ответ 6

Вот самый неэффективный способ получить счет во всех ответах. Но вы получите словарь, содержащий пары ключ-значение в качестве бонуса.

string test = "key1=value1&key2=value2&key3=value3";

var keyValues = Regex.Matches(test, @"([\w\d]+)=([\w\d]+)[&$]*")
                     .Cast<Match>()
                     .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);

var count = keyValues.Count - 1;