Количество вхождений символа в строку [дубликаты]

На этот вопрос уже есть ответ:

Как бы вы посчитали вхождения строки (на самом деле символ) внутри строки? 29 ответов

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

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

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

 CodesInChaos01 мая 2012 г., 00:42
Почему регулярное выражение ??????
 ruffin11 окт. 2012 г., 15:27
Больше забавных ответовВо хотя они обрабатывают символыа такж строки в строках. Тесты и т. Д. Включены.
 Tanzelax01 мая 2012 г., 00:44
@ CodeInChaos Поскольку некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения».
 gdoron01 мая 2012 г., 00:47
@ Tanzelax.Как это ? : -)
 TaW04 сент. 2014 г., 16:16
'Очевидно, что НЕ дубликат, так как этот пост хочет считать символ, а не строку. Несмотря на это, следует отметить, что большинство ответов в сообщении, включая принятый, НЕПРАВИЛЬНЫ. (В том смысле, что они не учитывают появление строки, а только символы.) Неправильно + неправильно = правильно, но все же это одно из самых темных и смущающих мест SO ..

Ответы на вопрос(6)

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

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

е словарь, который содержит пары ключ-значение в качестве бонуса.

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;
 payo01 мая 2012 г., 01:09
haha, "самый неэффективный способ", люби это!
 Kroltan14 янв. 2014 г., 18:18
Поместите это как Q & A с меткойcode-trolling на Codegolf.stackexchange.com

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

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

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

var count = test.Count(x => x == '&');
 Free Coder 2413 апр. 2014 г., 11:56
LINQ тожепомедленне делать все. Проверьте эту веб-страницу для тестов если хочешьбыстр код.
 Hi-Angel12 авг. 2015 г., 16:52
@ FreeCoder24 это не проблема LINQ, а скорее плохой компилятор. Например. пример должен быть встроен в простой цикл (как в C ++ и Haskell).
 gdoron20 янв. 2016 г., 22:03
@ FreeCoder24, так же, как C # медленнее, чем Assembly во всем. Если хочешьбыстр код, используйте сборку. И, кстати, LINQ быстрее сортирует, чем «родные» методы фреймворка.
Решение Вопроса

Ты мог бы сделать это:

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

Или с LINQ:

test.Count(x => x == '&');
 Niall Connaughton01 дек. 2016 г., 02:45
Стоит отметить, что первый подход может быть невероятно дорогим, если строка длинная. В худшем случае, если строка большая и (почти) целиком состоит из повторяющихся разделителей (&), она может выделить 12-24x первоначальный размер строки из-за накладных расходов объекта в .Net. Я бы пошел со вторым подходом, и если это не достаточно быстро, то написать цикл for.

обратите внимание, что HttpContext имеет некоторую помощь для вас

int numberOfArgs = HttpContext.Current.QueryString.Count;

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

е:

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;
 Guffa04 сент. 2014 г., 19:45
@ TaW: я не вижу значительной разницы в скорости между короткими и длинными (1 МБ) строками, но по какой-то причине в режиме x64 разница больше, чем в режиме x86.
 TaW04 сент. 2014 г., 19:58
Я не проверял версию счетчика символов, но счет строк linq все больше и больше замедляется с более длинными строками и, наконец, умирает с исключением oom. 1МБ пока не проблема.
 Guffa19 окт. 2015 г., 16:24
@ PawelCioch: Должно быть что-то не так с вашим тестом производительности.Replace, Split илиIndexOf не может быть быстрее, чем обход строки и проверка каждого символа, поскольку это именно то, что они делают, только добавляя дополнительные издержки.
 TaW04 сент. 2014 г., 16:17
Удивительно близко к циклу в производительности только с довольно маленькими стогами сена.
 Guffa19 окт. 2015 г., 15:39
@ PawelCioch: чем длиннее строка, тем она будет медленнее. Не существует волшебного способа обработки всей строки без обработки всей строки.

Ваш ответ на вопрос