`
kevinhrw
  • 浏览: 189986 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C#统计子字符串出现次数

    博客分类:
  • C#
阅读更多
C#中没有统计子字符串出现次数的函数,那么如何在C#求出字符串中某字符的出现次数,比如求“ADSFGEHERGASDF”中“A”出现的次数。首先想到的方法当然是从头遍历字符串并统计:
c1 = 0;
for (int i = 0; i < str.Length; i++)
{
    if (str[i] == 'A')
    {
        c1++;
    }
}
第二种方法也很容易想到,将字符串中所有要查找的字符去除,然后比较去除前后的字符串长度即可。这种方法遭到了某人的鄙视,据说性能很差而且多占空间。
c2 = str.Length - str.Replace("A", String.Empty).Length;
接下来某人又提出了第三种方法,是用要查找的字符为分隔符,将原字符串分隔为多个子串,然后求子串的数目即可。在C#中这是一个写起来很短的方法:
c3 = str.Split(new char[] { 'A' }).Length - 1;
我们从原理可以推断出三者性能的顺序,但究竟差距是多少呢,还是要动手试验一下。这是非常经典的测试代码:
string str = "SADTHDGSAFSDGTGHRDGSADFADDRHDFSGASDAA";
Stopwatch sw = new Stopwatch();
long t;
int c = 0;
GC.Collect();
Application.DoEvents();
sw.Start();
for (int i = 0; i < 100000; i++)
{
    c = 三种算法
}
sw.Stop();
t = sw.ElapsedMilliseconds;
首先我们确保正确性,经测试三种方法都能正确处理多种情况,包括首尾、连续出现、不出现或串长度为0等,我所取的字符串是一个很普通的串。编译为Release版,预运行10次后获得以下结果:
遍历统计:13毫秒
替换后比较长度:112毫秒
断开字符串后计数:233毫秒
这里已经体现出差异,遍历统计比替换后比较要快10倍,断开字符串又要慢一些。接下来我又做了如下两个测试:
1、不改变字符串的长度,增加或减少要查找字符串的个数。
2、不改变要查找字符出现的频率,但增长字符串的长度。
结果发现,三种方法都随字符串长度增加线性变慢,而后两种方法还随要查找的字符增加而变慢。断开字符串的方法还受要查找字符串分布情况的影响。



c1 = 0;
for (int i = 0; i < str.Length; i++)
{
    if (str[i] == 'A')
    {
        c1++;
    }
}


c2 = str.Length - str.Replace("A", String.Empty).Length;

c3 = str.Split(new char[] { 'A' }).Length - 1;

public static int ContainCount(string input, char value, bool ignoreCase)
{
if (ignoreCase)
{
input = input.ToLower();
if (Char.IsUpper(value))
{
value = Char.ToLower(value);
}
}

int count = 0;

for (int i = 0; (i = input.IndexOf(value, i)) >= 0; i++)
{
count++;
}

return count;
} 

分享到:
评论

相关推荐

    统计字符串中子字符串出现的次数,并返回

    在C#中,统计子字符串出现的次数主要依赖于`string`类提供的方法和基本的循环结构。其中,`IndexOf()`方法是核心,它用于查找子字符串在父字符串中的位置。该方法返回子字符串首次出现的索引,如果未找到则返回-1。...

    C#统计txt文本中每个汉字出现次数

    例如,`string.Split()`可以将字符串分割成多个子字符串,`string.Contains()`用于检查字符串是否包含特定字符或子串。 2. **正则表达式(Regex)**:正则表达式是一种强大的文本匹配模式,用于在字符串中查找、...

    字符串的处理.doc

    - **查找子字符串**:`String_comparison` 函数用于在一个主字符串中查找指定的子字符串,如果找到则返回首次出现的位置,未找到则返回 -1。 2. **替换**: - **替换第一次出现**:替换字符串中首次出现的目标...

    C#词频统计及显示程序源代码(及微软数据可视化组件的应用示例)

    接着,可以使用字典(`Dictionary`)或其他数据结构来存储每个单词及其出现的次数,实现词频统计。 “微软数据可视化组件”通常指的是微软的WPF(Windows Presentation Foundation)框架中的数据可视化控件,例如`...

    MSDN离线版C# 脚本手册 C# 指南.pdf

    - **如何对某个词在字符串中出现的次数进行计数 (LINQ)**:指导如何统计字符串中特定单词的出现频率。 - **如何查询包含一组指定词语的句子 (LINQ)**:讲解如何从字符串中查找包含特定词语的句子。 - **如何查询...

    c#(容器:关联容器、适配容器、顺序容器)

    2. **String**: 专门用于存储和操作字符串的容器,类似于Vector,但提供了许多特定于字符串的操作,如拼接、查找子字符串等。 3. **Deque**: 双端队列,允许在两端进行插入和删除操作,与Vector类似,但支持在两端...

    C#编程经验技巧宝典

    76 &lt;br&gt;0111 计算字符串中子字符串出现的次数 76 &lt;br&gt;0112 获得字符串中大写字母的个数 77 &lt;br&gt;0113 获得某字符在字符串中最后出现的位置 78 &lt;br&gt;0114 如何找出字符串中某一字符的所有位置 78...

    C#开发的图书管理系统(含说明文档)

    通过连接字符串、命令对象、数据适配器和数据集等组件,实现数据的存取。 5. 文件存储:系统可能包含电子书籍的元数据文件,如PDF或EPUB格式,这些文件可能被存储在本地文件系统或云存储服务中,便于用户在线阅读或...

    C#(winform)实现哈夫曼

    2. **字符频率统计**:读取文件内容,统计每个字符出现的次数,构建频率表。可以使用`StreamReader`类来读取文件,配合`Dictionary, int&gt;`存储频率信息。 3. **最小堆的实现**:在C#中,没有内置的优先队列,但可以...

    C#开发经验技巧宝典

    0909 如何对字符串进行查询 532 0910 如何进行单条数据的添加 533 0911 如何进行批量数据的添加 533 0912 如何对数据进行修改 534 0913 如何对数据进行删除 534 0914 对数据库数据进行局部删除 534 ...

    C#.net_经典编程例子400个

    81 实例068 在ListView控件中对数据排序或统计 83 实例069 在ListView控件中绘制底纹 84 实例070 在列表视图中拖动视图项 85 实例071 用ListView控件选取整行数据 88 实例072 用ListView...

    C#程序单词注释汇总

    - 子字符串。 - 字符串中的一部分连续字符序列。 74. **Console**: - 控制台。 - 系统提供的一种与用户交互的界面。 75. **Union**: - 联合。 - 数据库查询中的关键字,用于合并多个查询结果。 76. **Cast*...

    程序员考试刷题-c-sharp-interview-q-and-a:C#问题和答案

    多种方式类似反转字符串,统计字符串、子字符串中char的出现次数 解决矩阵问题。 单一职责原则 它指出一个类应该有一个且唯一的改变理由。 开闭原则 它规定一个类应该对扩展开放,对修改关闭。 里氏替换原则 它指出...

    HuffmanEncoding:C#中的Huffman编码

    在C#中,这可以通过遍历输入字符串,查找每个字符的编码,并将其连接起来实现。 解码阶段,从压缩后的数据恢复原始信息。这需要逆向过程,即从霍夫曼编码通过霍夫曼树重新构造原始字符。从编码的第一个位开始,按照...

    最新sql考试题答案

    - 通过循环倒序输出分割后的子字符串。 #### SQL Union 查询 - **SQL 查询语句**: ```sql select 'Ϸ' as ς, Ϸ as Μ from a_dist union select '˹' as ς, ˹ as Μ from a_dist union select 'е' ...

    C#基础编程练习题.doc

    - 接着,遍历该字符串,统计字符'1'出现的次数。 - 或者采用位运算的方式,通过循环不断对2取余并右移来实现。 **示例代码**: ```csharp int CountOnesInBinary(int n) { int count = 0; while (n &gt; 0) { ...

Global site tag (gtag.js) - Google Analytics