计算字符串开头的空格数量

26

我该如何在C#中计算字符串开头的空格数?

例如:

"    this is a string"

结果将是4。不确定如何正确执行此操作。

谢谢。

6个回答

39
使用 Enumerable.TakeWhileChar.IsWhiteSpaceEnumerable.Count
int count = str.TakeWhile(Char.IsWhiteSpace).Count();

请注意,不仅有" "是空格但是
空格字符包括以下Unicode字符:
以下是需要翻译的内容:
  • 属于 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)、FOUR-PER-EM SPACE (U+2005)、SIX-PER-EM SPACE (U+2006)、FIGURE SPACE (U+2007)、PUNCTUATION SPACE (U+2008)、THIN SPACE (U+2009)、HAIR SPACE (U+200A)、NARROW NO-BREAK SPACE (U+202F)、MEDIUM MATHEMATICAL SPACE (U+205F) 和 IDEOGRAPHIC SPACE (U+3000)。
  • 属于 LineSeparator 类别的成员仅包括 LINE SEPARATOR 字符 (U+2028)。
  • 属于 ParagraphSeparator 类别的成员仅包括 PARAGRAPH SEPARATOR 字符 (U+2029)。这些字符包括 CHARACTER TABULATION (U+0009)、LINE FEED (U+000A)、LINE TABULATION (U+000B)、FORM FEED (U+000C)、CARRIAGE RETURN (U+000D)、NEXT LINE (U+0085) 和 NO-BREAK SPACE (U+00A0)。

......所以基本上是空格、换行和制表符


正是我所需要的,谢谢!还有感谢您提供关于空格的信息。 - Joel

11

你可以使用 LINQ,因为 string 实现了 IEnumerable<char>

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

10
input.TakeWhile(c => c == ' ').Count()
input.Length - input.TrimStart(' ').Length

1
TrimStart 的解决方案是最简单的。 - helrich
@helrich嗯,它会生成新的字符串,所以对于长字符串来说并不是最佳选择 :) 因此我发布了两个解决方案。 - Sergey Berezovskiy
1
两者略有不同,因为TrimStart内部使用了Char.IsWhiteSpace。在input=" \t text"上进行检查。第一个返回1,第二个返回3,因为制表符被计算为空格。 - Tim Schmelter
1
第二行应该是input.Length - input.TrimStart(' ').Length以获得与第一行相同的结果。 - Andreas Adler
@helrich:两个不同值的减法,需要考虑顺序,这并不比 TakeWhile(Char.IsWhiteSpace).Count() 更简单(一旦你理解了字符串是一个 IEnumerable<char>)。 - Tim Schmelter
1
@TimSchmelter 感谢您,Tim。我不知道 TrimStart 会将 \t\r 视为空格。 - Sergey Berezovskiy

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

4
哇,与MarcinJuraszek的答案中的LINQ等效代码相比,这确实是很多的代码。当我们没有LINQ时,我不会想念这些可怕的日子。 :) - Andreas Adler
еЃ‡и®ңдҢ жѓійЃүе…ҚдҢүз”ЁLINQ并дҢүз”ЁеҺџе§‹зљ„C#пәЊе°†й‚ӘдёҒforеңҒзҺҮж”№дёғwhileеңҒзҺҮдәљж›өзџ­гЂ‚ - iCollect.it Ltd

-1

虽然我喜欢基于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;           


    }

-1
 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接