Я пытаюсь получить количество вхождений определенного символа, такого как &
в следующей строке.
string test = "key1=value1&key2=value2&key3=value3";
Как определить, что в приведенной выше тестовой строковой переменной есть 2 амперсанда (&)?
Я пытаюсь получить количество вхождений определенного символа, такого как &
в следующей строке.
string test = "key1=value1&key2=value2&key3=value3";
Как определить, что в приведенной выше тестовой строковой переменной есть 2 амперсанда (&)?
Вы можете сделать это:
int count = test.Split('&').Length - 1;
Или с LINQ:
test.Count(x => x == '&');
Потому что LINQ
может делать все...:
string test = "key1=value1&key2=value2&key3=value3";
var count = test.Where(x => x == '&').Count();
Или, если хотите, вы можете использовать перегрузку Count
, которая берет предикат:
var count = test.Count(x => x == '&');
Самый прямой и наиболее эффективный - просто пропустить символы в строке:
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;
Зачем использовать regex для этого. String
реализует IEnumerable<char>
, поэтому вы можете просто использовать LINQ.
test.Count(c => c == '&')
Ваш пример строки выглядит как часть строки запроса GET. Если это так, обратите внимание, что HttpContext поможет вам
int numberOfArgs = HttpContext.Current.QueryString.Count;
Подробнее о том, что вы можете делать с QueryString, см. NameValueCollection
Вот самый неэффективный способ получить счет во всех ответах. Но вы получите словарь, содержащий пары ключ-значение в качестве бонуса.
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;