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#字符串删除指定字符串|C#字符串删除子字符串
C#格式化字符串C#格式化字符串C#格式化字符串C#格式化字符串
C#批量删除字符串中间的字符串,输入开始字符串,结束字符串,点击删除按钮之后,获取新的删除后的字符串(开始字符串跟结束字符串不删除)
C#打开含有对应字符的串口,并发送字符串
C#连接Oracle数据库字符串 C#连接Oracle数据库字符串
本文实例讲述了C#实现将字符串转换成日期格式的方法。分享给大家供大家参考。具体实现方法如下: 代码如下:string s = “20120114161145”; Response.Write(DateTime.ParseExact(s, “yyyyMMddHHmmss”, new System...
基于CodeDom 实现的字符串执行基于CodeDom 实现的字符串执行基于CodeDom 实现的字符串执行
设计一个算法,统计在输入的字符串中各个不同字符出现的频度。(字符串中合法字符为A~Z这26个字母和0~9这10个数字)
本文实例讲述了C#判断字符串是否存在字母及字符串中字符的替换的方法。分享给大家供大家参考。具体实现方法如下: 首先要添加对命名空间“using System.Text.RegularExpressions;”的引用 下面以一个字符串为例: ...
C# ASCII码和字符串互转
.net下C#数据库连接字符串在配置文件中的加密解密类
用C#实现的遍历字符串,遍历一次查出每个字符出现的次数,遍历过程,全部遍历一次,获得字符串中某个字符出现的次数。
C#中,字符串传为16进制是非常使用的算法,如在一些特定是情况下,我们无法储存或传递中文字符串,这时候可以将他转为16进制使用,需要时再将其逆转回来。
从键盘输入一个字母+数字的字符串,统计数字所出现位置
可以动态解析并执行字符串 参见http://blog.csdn.net/hsrzq/archive/2009/08/17/4456361.aspx 别忘了引用EvalGuy命名空间!
c#生成XML字符串,简单易懂,中间过程不生成XML文件,不用担心多个操作的访问问题,返回结果为标准的XMl格式。
计算字符串中子串出现的次数 java程序求计算字符串中子串出现的次数
(c#)字符串转换成字符数组 字符串转换成int 数组
C#解析Json字符串以及里面使用的.dll文件。