Подсчитайте пробелы в начале строки

Как мне подсчитать количество пробелов в начале строки в С#?

Пример:

"    this is a string"

и результат будет 4. Не знаете, как это сделать правильно.

Спасибо.

Ответ 1

Используйте Enumerable.TakeWhile, Char.IsWhiteSpace и Enumerable.Count

int count = str.TakeWhile(Char.IsWhiteSpace).Count();

Обратите внимание, что не только " " - это пробел но:

Символы пробела следующие символы Юникода:

  • Члены категории SpaceSeparator, включающие символы SPACE (U + 0020), OGHAM SPACE MARK (U + 1680), MONGOLIAN VOWEL SEPARATOR (U + 180E), EN QUAD (U + 2000), EM QUAD (U +2001), EN SPACE (U + 2002), EM SPACE (U + 2003), THREE-PER-EM SPACE (U + 2004), ЧЕТЫРЕПЕРЕВОСТОЧНОЕ ПРОСТРАНСТВО (U + 2005), ПРОСТРАНСТВО SIX-PER-EM (U + 2006), РИСУНОЧНОЕ ПРОСТРАНСТВО (U + 2007), ПРОСТРАНСТВО (U + 2008), ТОНКОЕ ПРОСТРАНСТВО (U + 2009), ВОЛОСНОЕ ПРОСТРАНСТВО (U + 200A), ПРОСМОТР ПРОПУСКА (U + 202F), СРЕДНЯЯ МАТЕМАТИЧЕСКОЕ ПРОСТРАНСТВО (U + 205F) и ИДЕОГРАФИЧЕСКОЕ ПРОСТРАНСТВО (U + 3000).
  • Члены категории LineSeparator, которые состоят исключительно из символа LINE SEPARATOR (U + 2028).
  • Члены категории ParagraphSeparator, которая состоит исключительно из символа PARAPRAPH SEPARATOR (U + 2029). Символы ХАРАКТЕРИСТИКА (U + 0009), ЛИНИЯ ПОДАЧИ (U + 000A), ЛИНИЯ ТАБУЛЯЦИЯ (U + 000B), ПОДАЧА ФОРМЫ (U + 000C), ВОЗВРАТ ПЕРЕВОЗКИ (U + 000D), СЛЕДУЮЩАЯ ЛИНИЯ (U + 0085), и NO-BREAK SPACE (U + 00A0).

Ответ 2

Вы можете использовать LINQ, потому что string реализует IEnumerable<char>:

var numberOfSpaces = input.TakeWhile(c => c == ' ').Count();

Ответ 3

input.TakeWhile(c => c == ' ').Count()

Или

input.Length - input.TrimStart(' ').Length

Ответ 4

Попробуйте следующее:

        static void Main(string[] args)
        {
            string s = "    this is a string";
            Console.WriteLine(count(s));
        }

        static int count(string s)
        {
            int total = 0;
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] == ' ')
                    total++;
                else
                    break;
            }
            return total;
        }

Ответ 5

Хотя мне нравятся ответы Linq на основе здесь скучного небезопасного метода, который должен быть довольно быстрым

    private static unsafe int HowManyLeadingSpaces(string input)
    {
        if (input == null)
            return 0;
        if (input.Length == 0)
            return 0;
        if (string.IsNullOrWhiteSpace(input))
            return input.Length;

        int count = 0;
        fixed (char* unsafeChar = input)
        {

            for (int i = 0; i < input.Length; i++)
            {
                if (char.IsWhiteSpace((char)(*(unsafeChar + i))))
                    count++;
                else
                    break;
            }
        }

        return count;           


    }

Ответ 6

 int count = 0, index = 0, lastIndex = 0;
  string s = "    this is a string";

  index = s.IndexOf(" ");
  while (index > -1) 
  {
    count++;
    index = s.IndexOf(" ", index + 1);

    if ((index - lastIndex) > 1)
      break;

    lastIndex = index;
  } 

  Console.WriteLine(count);