【问题标题】:How many specified chars are in a string?一个字符串中有多少个指定的字符?
【发布时间】:2010-10-18 12:15:25
【问题描述】:

550e8400-e29b-41d4-a716-446655440000 为例,如何数一数 - 字符在这样的字符串中?

我目前正在使用:

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

有没有什么方法不需要加1...比如使用Count 可能吗?

所有其他方法,例如

Contains IndexOf 等只返回第一个位置和一个boolean 值,没有返回找到了多少

我错过了什么?

【问题讨论】:

  • 你需要减1,不要加...
  • true :) 我写答案的错误......在代码上正确。

标签: c# .net-3.5 string


【解决方案1】:

您可以为此目的使用 LINQ 方法 Enumerable.Count(注意 stringIEnumerable<char>):

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

参数是Func<char, bool>,它是一个谓词,用于指定项目何时被视为“通过”过滤器。

这(粗略地说)相当于:

int numberOfHyphens = 0;

foreach (char c in text)
{
    if (c == '-') numberOfHyphens++;
}

【讨论】:

  • +1 用于解释这是 LINQ 的一部分,以及为什么它适用于此。
【解决方案2】:
using System.Linq;

..

int total = "550e8400-e29b-41d4-a716-446655440000".Count(c => c == '-');

【讨论】:

    【解决方案3】:
    int total = "550e8400-e29b-41d4-a716-446655440000".Count(c => c == '-');
    

    【讨论】:

      【解决方案4】:

      最直接的方法是简单地遍历字符,因为这是任何算法都必须以某种方式做的事情:

      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;
      

      【讨论】:

      • 现在我想知道这些变体中的哪些与彼此相比有哪些好处,如果重要的话,哪个更快或更有效。
      • @Cthulhu:简单的循环是最有效的,很难改进。 Count 版本的性能相当接近,并且生成的代码更短。
      【解决方案5】:
      int total = "550e8400-e29b-41d4-a716-446655440000".Count(c => c == '-')
      

      【讨论】:

        【解决方案6】:

        要查找字符串中“-”的数量,您需要遍历字符串并检查每个字符,因此最简单的方法就是编写一个函数来执行此操作。使用 Split 实际上需要更多时间,因为它会无缘无故地创建数组。

        此外,您正在尝试做的事情令人困惑,甚至看起来您做错了(您需要减去 1)。

        【讨论】:

          【解决方案7】:

          试试这个:

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

          【讨论】:

          • 为什么要先调用 ToCharArray?
          • 我还注意到智能感知没有提供我的 Count(this) 作为字符串,它只有在转换为 char 数组后才起作用。也许是 vs2008 的智能感知中的错误?
          • @codymanix - 我相信在字符串实例上隐藏IEnumerable<char> 的扩展方法是一个深思熟虑的决定。但是我不记得原因了。
          • @codymanix:我在某处(不记得确切的位置)读到这是一个经过深思熟虑的设计决定,因为他们不希望 IEnumerable<> 扩展的完整列表在@正在使用 987654325@。在我看来,这是一个有缺陷的决定。
          • @codymanix - 这是一个关于它的问题:stackoverflow.com/questions/345883/…
          猜你喜欢
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-12
          • 2019-11-03
          • 2013-11-01
          • 2021-10-28
          相关资源
          最近更新 更多