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。...
例如,`string.Split()`可以将字符串分割成多个子字符串,`string.Contains()`用于检查字符串是否包含特定字符或子串。 2. **正则表达式(Regex)**:正则表达式是一种强大的文本匹配模式,用于在字符串中查找、...
- **查找子字符串**:`String_comparison` 函数用于在一个主字符串中查找指定的子字符串,如果找到则返回首次出现的位置,未找到则返回 -1。 2. **替换**: - **替换第一次出现**:替换字符串中首次出现的目标...
接着,可以使用字典(`Dictionary`)或其他数据结构来存储每个单词及其出现的次数,实现词频统计。 “微软数据可视化组件”通常指的是微软的WPF(Windows Presentation Foundation)框架中的数据可视化控件,例如`...
- **如何对某个词在字符串中出现的次数进行计数 (LINQ)**:指导如何统计字符串中特定单词的出现频率。 - **如何查询包含一组指定词语的句子 (LINQ)**:讲解如何从字符串中查找包含特定词语的句子。 - **如何查询...
2. **String**: 专门用于存储和操作字符串的容器,类似于Vector,但提供了许多特定于字符串的操作,如拼接、查找子字符串等。 3. **Deque**: 双端队列,允许在两端进行插入和删除操作,与Vector类似,但支持在两端...
76 <br>0111 计算字符串中子字符串出现的次数 76 <br>0112 获得字符串中大写字母的个数 77 <br>0113 获得某字符在字符串中最后出现的位置 78 <br>0114 如何找出字符串中某一字符的所有位置 78...
通过连接字符串、命令对象、数据适配器和数据集等组件,实现数据的存取。 5. 文件存储:系统可能包含电子书籍的元数据文件,如PDF或EPUB格式,这些文件可能被存储在本地文件系统或云存储服务中,便于用户在线阅读或...
2. **字符频率统计**:读取文件内容,统计每个字符出现的次数,构建频率表。可以使用`StreamReader`类来读取文件,配合`Dictionary, int>`存储频率信息。 3. **最小堆的实现**:在C#中,没有内置的优先队列,但可以...
0909 如何对字符串进行查询 532 0910 如何进行单条数据的添加 533 0911 如何进行批量数据的添加 533 0912 如何对数据进行修改 534 0913 如何对数据进行删除 534 0914 对数据库数据进行局部删除 534 ...
81 实例068 在ListView控件中对数据排序或统计 83 实例069 在ListView控件中绘制底纹 84 实例070 在列表视图中拖动视图项 85 实例071 用ListView控件选取整行数据 88 实例072 用ListView...
- 子字符串。 - 字符串中的一部分连续字符序列。 74. **Console**: - 控制台。 - 系统提供的一种与用户交互的界面。 75. **Union**: - 联合。 - 数据库查询中的关键字,用于合并多个查询结果。 76. **Cast*...
多种方式类似反转字符串,统计字符串、子字符串中char的出现次数 解决矩阵问题。 单一职责原则 它指出一个类应该有一个且唯一的改变理由。 开闭原则 它规定一个类应该对扩展开放,对修改关闭。 里氏替换原则 它指出...
在C#中,这可以通过遍历输入字符串,查找每个字符的编码,并将其连接起来实现。 解码阶段,从压缩后的数据恢复原始信息。这需要逆向过程,即从霍夫曼编码通过霍夫曼树重新构造原始字符。从编码的第一个位开始,按照...
- 通过循环倒序输出分割后的子字符串。 #### SQL Union 查询 - **SQL 查询语句**: ```sql select 'Ϸ' as ς, Ϸ as Μ from a_dist union select '˹' as ς, ˹ as Μ from a_dist union select 'е' ...
- 接着,遍历该字符串,统计字符'1'出现的次数。 - 或者采用位运算的方式,通过循环不断对2取余并右移来实现。 **示例代码**: ```csharp int CountOnesInBinary(int n) { int count = 0; while (n > 0) { ...