ASP.NET从字符串中查找字符出现次数的具体实现方法

 更新时间:2013年11月08日 16:21:55   作者:  
今天在一场“特殊的讨论”中引入了一个问题,如何在C#求出字符串中某字符的出现次数,比如求“ADSFGEHERGASDF”中“A”出现的次数

首先想到的方法当然是从头遍历字符串并统计:

复制代码 代码如下:

c1=0;
for(inti=0;i {
if(str[i]=='A')
{
c1++;
}
}

第二种方法也很容易想到,将字符串中所有要查找的字符去除,然后比较去除前后的字符串长度即可。这种方法遭到了某人的鄙视,据说性能很差而且多占空间。

复制代码 代码如下:

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

接下来某人又提出了第三种方法,是用要查找的字符为分隔符,将原字符串分隔为多个子串,然后求子串的数目即可。在C#中这是一个写起来很短的方法:

复制代码 代码如下:

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

我们从原理可以推断出三者性能的顺序,但究竟差距是多少呢,还是要动手试验一下。这是非常经典的测试代码:

复制代码 代码如下:

stringstr="SADTHDGSAFSDGTGHRDGSADFADDRHDFSGASDAA";

Stopwatchsw=newStopwatch();

longt;
intc=0;
GC.Collect();
Application.DoEvents();

sw.Start();

for(inti=0;i<100000;i++)
{
c=三种算法
}

sw.Stop();

t=sw.ElapsedMilliseconds;

首先我们确保正确性,经测试三种方法都能正确处理多种情况,包括首尾、连续出现、不出现或串长度为0等,我所取的字符串是一个很普通的串。编译为Release版,预运行10次后获得以下结果:

遍历统计:13毫秒
替换后比较长度:112毫秒
断开字符串后计数:233毫秒

这里已经体现出差异,遍历统计比替换后比较要快10倍,断开字符串又要慢一些。接下来我又做了如下两个测试:

1、不改变字符串的长度,增加或减少要查找字符串的个数。
2、不改变要查找字符出现的频率,但增长字符串的长度。

结果发现,三种方法都随字符串长度增加线性变慢,而后两种方法还随要查找的字符增加而变慢。

断开字符串的方法还受要查找字符串分布情况的影响。

研究Replace函数和Split函数的实现可以彻底解决这个问题。不过我没有心情细细研究了,我还是决定选用第二种方法——替换后比较长度。虽然其速度比第一种方法慢,但易于改写为求长度不为1的子串出现次数的方法。第一种方法若改为求长度大于1的字串就要考虑很多因素(尽管不一定真的很麻烦),我懒得想了,呵呵。

相关文章

  • MVC4制作网站教程第一篇 绪论

    MVC4制作网站教程第一篇 绪论

    MVC4制作网站教程第一篇,创建项目,网站配置,从最基本的操作入手,帮助大家了解MVC4网站入门制作的过程,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Asp.Net模拟表单提交数据和上传文件的实现代码

    Asp.Net模拟表单提交数据和上传文件的实现代码

    这篇文章主要介绍了Asp.Net模拟表单提交数据和上传文件的实现代码,本文对3种情况都做了介绍,只有普通数据的表单、只上传文件的表单、包含普通数据和上传文件表单,需要的朋友可以参考下
    2014-08-08
  • jenkins部署.net平台自动化构建的方法步骤

    jenkins部署.net平台自动化构建的方法步骤

    这篇文章主要介绍了jenkins部署.net平台自动化构建的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • asp.net下获取Excel所有的工作表名称

    asp.net下获取Excel所有的工作表名称

    asp.net下获取Excel所有的工作表名称...
    2007-03-03
  • .NET发送邮件的实现方法示例

    .NET发送邮件的实现方法示例

    这篇文章主要给大家介绍了关于.NET发送邮件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • ASP.NET Core获取正确查询字符串参数示例

    ASP.NET Core获取正确查询字符串参数示例

    这篇文章主要为大家介绍了ASP.NET Core正确获取查询字符串参数,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • web.config中配置数据库连接的方式

    web.config中配置数据库连接的方式

    Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。本文主要介绍web.config中配置数据库连接的两种方式,一起来看。
    2015-10-10
  • Asp.net 下载功能的解决方案

    Asp.net 下载功能的解决方案

    今天在网上找到一个比较好的asp.net下载方法的解决方案
    2009-11-11
  • .NET Core系列之MemoryCache 缓存域

    .NET Core系列之MemoryCache 缓存域

    这篇文章主要介绍了.NET Core系列之MemoryCache 缓存域,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Hangfire在ASP.NET CORE中的简单实现方法

    Hangfire在ASP.NET CORE中的简单实现方法

    下面小编就为大家分享一篇Hangfire在ASP.NET CORE中的简单实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11

最新评论