2013-12-05 4 views

ответ

18

Использование Enumerable.TakeWhile, Char.IsWhiteSpace и Enumerable.Count

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

Обратите внимание, что не только " " является белым пространством but:

Символы белого пространства - это символы мычание Unicode:

  • Члены категории SpaceSeparator, которая включает в себя символы пробела (U + 0020), Ogham КОСМИЧЕСКИЙ MARK (U + 1680), монгольский гласный сепараторе (U + 180E), EN QUAD (U + 2000), EM QUAD (U + 2001), EN SPACE (U + 2002), EM SPACE (U + 2003), THREE-PER-EM SPACE (U + 2004), FOUR-PER-EM SPACE (U + 2005) , SIX-PER-EM SPACE (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).
+0

Просто то, что мне нужно, спасибо! и спасибо за информацию о белых пространствах. – user2909323

8

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

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

Или

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

Решение 'TrimStart' является самым простым. – helrich

+0

@helrich хорошо, он создает новую строку, поэтому это не лучший вариант для длинных строк :) Таким образом, я разместил два решения. –

+1

Оба делают несколько разные вещи, поскольку 'TrimStart' внутренне использует' Char.IsWhiteSpace'. Проверьте это на 'input =" \ t text "'. Сначала возвращает 1 и второе 3, поскольку символ табуляции считается белым. –

2

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

 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; 
     } 
+2

Wow, that's действительно много кода, когда вы сравниваете это с эквивалентом LINQ в ответе MarcinJuraszek. Я не пропущу этих ужасных дней, когда у нас не было LINQ. :) –

+0

Предполагая, что вы хотите избежать LINQ и использовать raw C#, изменение этого 'for' в цикле' while' было бы намного короче –

0

Хотя мне нравятся ответы, основанные 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;   


    } 
0
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); 
Смежные вопросы