Сколько указанных символов в строке? - PullRequest
3 голосов
/ 18 октября 2010

взял пример строки как 550e8400-e29b-41d4-a716-446655440000 как можно посчитать, сколько - символов в такой строке?

Я сейчас использую:

int total = "550e8400-e29b-41d4-a716-446655440000".Split('-').Length + 1;

Есть ли какой-нибудь метод, который нам не нужно добавлять 1 ... как, например, использование Count возможно?

Все другие методы, такие как

Contains IndexOf и т. Д. Возвращает только первую позицию и значение boolean, ничего не возвращает сколько было найдено.

что мне не хватает?

Ответы [ 7 ]

17 голосов
/ 18 октября 2010

Для этой цели вы можете использовать метод LINQ Enumerable.Count (обратите внимание, что string - это IEnumerable<char>):

int numberOfHyphens = text.Count(c => c == '-');

Аргумент - Func<char, bool> предикат, который указывает, когда считается, что элемент «прошел» фильтр.

Это (свободно говоря) эквивалентно:

int numberOfHyphens = 0;

foreach (char c in text)
{
    if (c == '-') numberOfHyphens++;
}
5 голосов
/ 18 октября 2010
using System.Linq;

..

int total = "550e8400-e29b-41d4-a716-446655440000".Count(c => c == '-');
4 голосов
/ 18 октября 2010

Самый простой способ - просто зацикливать символы, так как это то, что любой алгоритм должен делать так или иначе:

int total = 0;
foreach (char c in theString) {
  if (c == '-') total++;
}

Вы можете использовать методы расширения, чтобы сделать в основном то же самое:

int total = theString.Count(c => c == '-');

Или:

int total = theString.Aggregate(0, (t,c) => c == '-' ? t + 1 : t)

Тогда есть интересные (но менее эффективные) приемы, такие как удаление символов и сравнение длин:

int total = theString.Length - theString.Replace("-", String.Empty).Length;

Или с помощью регулярного выражения найти все вхождения символа:

int total = Regex.Matches(theString, "-").Count;
4 голосов
/ 18 октября 2010
int total = "550e8400-e29b-41d4-a716-446655440000".Count(c => c == '-');
2 голосов
/ 18 октября 2010

Чтобы найти число «-» в строке, вам нужно будет перебрать строку и проверить каждый символ, поэтому самое простое - написать функцию, которая это делает.Использование Split на самом деле занимает больше времени, потому что оно создает массивы без причины.

Кроме того, это сбивает с толку то, что вы пытаетесь сделать, и даже похоже, что вы ошиблись (вам нужно вычесть 1).

2 голосов
/ 18 октября 2010
int total = "550e8400-e29b-41d4-a716-446655440000".Count(c => c == '-')
1 голос
/ 18 октября 2010

Попробуйте это:

string s = "550e8400-e29b-41d4-a716-446655440000";
int result = s.ToCharArray().Count( c => c == '-');
...