C# 在C中获得字符串字数的可靠方法是什么#

C# 在C中获得字符串字数的可靠方法是什么#,c#,regex,text-parsing,C#,Regex,Text Parsing,我不知道该怎么办。现在我正在计算空格以获得字符串的字数,但是如果有双空格,字数将不准确。有更好的方法吗?这似乎适合我: var input = "This is a test"; var count = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length; 这似乎对我有用: var input = "This is a test"; var count = input.Split(" ".

我不知道该怎么办。现在我正在计算空格以获得字符串的字数,但是如果有双空格,字数将不准确。有更好的方法吗?

这似乎适合我:

var input = "This is a  test";
var count = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length;

这似乎对我有用:

var input = "This is a  test";
var count = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length;
尝试:

尝试:


虽然基于Split的解决方案写起来很短,但它们可能会很昂贵,因为所有的字符串对象都需要创建然后扔掉。我希望有一个明确的算法,比如

  static int CountWords(string s)
  {
    int words = 0;
    bool inword = false;
    for(int i=0; i < s.Length; i++) {
      switch(s[i]) {
      case ' ':case '\t':case '\r':case '\n':
          if(inword)words++;
          inword = false;
          break;
      default:
          inword = true;
          break;
      }
    }
    if(inword)words++;
    return words;
  }
static int CountWords(字符串s)
{
int字=0;
bool-inword=false;
对于(int i=0;i

效率更高(加上它也可以考虑额外的空白字符)。

虽然基于拆分的解决方案写得很短,但它们可能会变得昂贵,因为所有的字符串对象都需要创建然后扔掉。我希望有一个明确的算法,比如

  static int CountWords(string s)
  {
    int words = 0;
    bool inword = false;
    for(int i=0; i < s.Length; i++) {
      switch(s[i]) {
      case ' ':case '\t':case '\r':case '\n':
          if(inword)words++;
          inword = false;
          break;
      default:
          inword = true;
          break;
      }
    }
    if(inword)words++;
    return words;
  }
static int CountWords(字符串s)
{
int字=0;
bool-inword=false;
对于(int i=0;i

是更有效的(加上它也可以考虑额外的空白字符)。< /P>

交替版本的@马丁诉。Löwis,它使用了

foreach
char.IsWhiteSpace()
,在处理其他文化时应该更正确

int CountWithForeach(string para)
{
    bool inWord = false;
    int words = 0;
    foreach (char c in para)
    {
        if (char.IsWhiteSpace(c))
        {
            if( inWord )
                words++;
            inWord = false;
            continue;
        }
        inWord = true;
    }
    if( inWord )
        words++;

    return words;
}

@Martin v.的替代版本。Löwis,它使用了
foreach
char.IsWhiteSpace()
,在处理其他文化时应该更正确

int CountWithForeach(string para)
{
    bool inWord = false;
    int words = 0;
    foreach (char c in para)
    {
        if (char.IsWhiteSpace(c))
        {
            if( inWord )
                words++;
            inWord = false;
            continue;
        }
        inWord = true;
    }
    if( inWord )
        words++;

    return words;
}


如果你要这样做,我建议你使用while循环,一个索引变量和string.IndexOfAny(char[],int)。@bobbymcr我不知道这有什么帮助。大概IndexOfAny只是线性搜索。在我的系统中,IndexOfAny方法确实更快。线性扫描+开关=介于0.014和0.015 ms之间;while+IndexOfAny=介于0.011和0.012 ms之间。这里的代码:这几乎不重要,但我想确定!)哎呀,前面的代码中有个bug。。。更正:。性能结果是一样的。@bobbymcr:我不能复制你的结果。案例版本运行0.008ms,indexof版本运行0.016ms,使用VS 2008。如果我让字符串长得多(例如,将其加倍10倍),indexof版本将持续花费两倍的时间。如果你这样做,我建议使用while循环、索引变量和string.IndexOfAny(char[],int)。@bobbymcr我看不出这有什么帮助。大概IndexOfAny只是线性搜索。在我的系统中,IndexOfAny方法确实更快。线性扫描+开关=介于0.014和0.015 ms之间;while+IndexOfAny=介于0.011和0.012 ms之间。这里的代码:这几乎不重要,但我想确定!)哎呀,前面的代码中有个bug。。。更正:。性能结果是一样的。@bobbymcr:我不能复制你的结果。案例版本运行0.008ms,indexof版本运行0.016ms,使用VS 2008。如果我使字符串更长(例如,将其加倍10倍),indexof版本始终需要两倍的时间。拆分会带来巨大的开销。通过字符的循环将是最快的路径。OTOH,RegEx可能比Split慢,因为生成的数组的类型(字符串)比匹配对象的类型(字符串)要简单。我在richard的语句中称为bullsh*t,结果表明Split在某些情况下实际上更快,只比foreach解决方案稍微慢一点。Spliting带来了巨大的开销。通过字符的循环将是最快的路径。OTOH,RegEx可能比Split慢,因为生成的数组的类型(字符串)比匹配对象的类型(字符串)要简单。我在richard的语句中称为bullsh*t,结果表明Split在某些情况下实际上更快,只比foreach解决方案略慢。有多少个词是“普通”呢?(想一想)@280Z28-你说得对。仅供参考,Word女士也将其视为一个词。那么“一、二、三、四”呢@codeulike是的,这是另一个好观点。因为这只是另一个海报答案的替代版本,更具文化意识,所以我将保持原样。在一个实际的程序中,我会进行单元测试,以准确地表明我的预期。你可以说这更像是一种自己解决问题的方法。正如其他地方所说,它的好处在于它只需一次就可以工作,并且内存压力最小。有多少个单词是“普通的”?(想一想)@280Z28-你说得对。仅供参考,Word女士也将其视为一个词。那么“一、二、三、四”呢@codeulike是的,这是另一个好观点。因为这只是另一个海报答案的替代版本,更具文化意识,所以我将保持原样。在一个实际的程序中,我会进行单元测试,以准确地表明我的预期。你可以说这更像是一种自己解决问题的方法。正如其他地方所述,它的好处在于它可以在一个过程中工作,并且具有最小的内存压力。