怎樣使ASP.NET從字符串中查找字符出現(xiàn)的次數(shù)_.Net教程
推薦:解讀Asp.Net 建立的在線 RSS 新聞聚合器概要 本文講解了如何使用XMLWeb控件獲取遠(yuǎn)程XML數(shù)據(jù)并在ASP.NET頁(yè)面顯示這些XML數(shù)據(jù),以及使用Repeater控件發(fā)布數(shù)據(jù)庫(kù)中的XML數(shù)據(jù)。在過(guò)去的幾年間,隨著異構(gòu)平臺(tái)間共享數(shù)據(jù)的需求不斷增長(zhǎng),XML的使用也呈爆炸性增長(zhǎng)。意識(shí)到這種趨勢(shì),微軟在整個(gè).NET框架中
今天在一場(chǎng)“特殊的討論”中引入了一個(gè)問(wèn)題,如何在C#求出字符串中某字符的出現(xiàn)次數(shù),比如求“ADSFGEHERGASDF”中“A”出現(xiàn)的次數(shù)。首先想到的方法當(dāng)然是從頭遍歷字符串并統(tǒng)計(jì):
程序代碼
c1=0;
for(inti=0;i {
if(str[i]=='A')
{
c1++;
}
}
第二種方法也很容易想到,將字符串中所有要查找的字符去除,然后比較去除前后的字符串長(zhǎng)度即可。這種方法遭到了某人的鄙視,據(jù)說(shuō)性能很差而且多占空間。
程序代碼
c2=str.Length-str.Replace("A",String.Empty).Length;
接下來(lái)某人又提出了第三種方法,是用要查找的字符為分隔符,將原字符串分隔為多個(gè)子串,然后求子串的數(shù)目即可。在C#中這是一個(gè)寫(xiě)起來(lái)很短的方法:
程序代碼
c3=str.Split(newchar[]{'A'}).Length-1;
我們從原理可以推斷出三者性能的順序,但究竟差距是多少呢,還是要?jiǎng)邮衷囼?yàn)一下。這是非常經(jīng)典的測(cè)試代碼:
程序代碼
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;
首先我們確保正確性,經(jīng)測(cè)試三種方法都能正確處理多種情況,包括首尾、連續(xù)出現(xiàn)、不出現(xiàn)或串長(zhǎng)度為0等,我所取的字符串是一個(gè)很普通的串。編譯為Release版,預(yù)運(yùn)行10次后獲得以下結(jié)果:
遍歷統(tǒng)計(jì):13毫秒
替換后比較長(zhǎng)度:112毫秒
斷開(kāi)字符串后計(jì)數(shù):233毫秒
這里已經(jīng)體現(xiàn)出差異,遍歷統(tǒng)計(jì)比替換后比較要快10倍,斷開(kāi)字符串又要慢一些。接下來(lái)我又做了如下兩個(gè)測(cè)試:
1、不改變字符串的長(zhǎng)度,增加或減少要查找字符串的個(gè)數(shù)。
2、不改變要查找字符出現(xiàn)的頻率,但增長(zhǎng)字符串的長(zhǎng)度。
結(jié)果發(fā)現(xiàn),三種方法都隨字符串長(zhǎng)度增加線性變慢,而后兩種方法還隨要查找的字符增加而變慢。
斷開(kāi)字符串的方法還受要查找字符串分布情況的影響。
研究Replace函數(shù)和Split函數(shù)的實(shí)現(xiàn)可以徹底解決這個(gè)問(wèn)題。不過(guò)我沒(méi)有心情細(xì)細(xì)研究了,我還是決定選用第二種方法——替換后比較長(zhǎng)度。雖然其速度比第一種方法慢,但易于改寫(xiě)為求長(zhǎng)度不為1的子串出現(xiàn)次數(shù)的方法。第一種方法若改為求長(zhǎng)度大于1的字串就要考慮很多因素(盡管不一定真的很麻煩),我懶得想了,呵呵。
分享:淺談ASP.NET兩個(gè)截取字符串的實(shí)用方法技巧兩個(gè)截取字符串的實(shí)用方法(超過(guò)一定長(zhǎng)度自動(dòng)換行) 1/**//// 2 /// 截取字符串,不限制字符串長(zhǎng)度 3 /// 4 /// 待截取的字符串 5 /// 每行的長(zhǎng)度,多于這個(gè)長(zhǎng)度自動(dòng)換行 6 /// 7 public string CutStr(string str,int len) 8 { string s=
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- Asp.net三層結(jié)構(gòu)中的變量引用與傳遞
- 如何解決CSV字段數(shù)據(jù)的雙引號(hào)問(wèn)題
- 判斷瀏覽器是否接受Cookies
- 用ASP.NET/C#連接Access和SQL Server數(shù)據(jù)庫(kù)
- 用 asp.net 動(dòng)態(tài)設(shè)置 WebService 引用
- ASP.NET 2.0中CSS不正常的解決方法
- 基于C#的接口基礎(chǔ)教程之四
- 怎樣實(shí)現(xiàn)MSMQ的消息加密
- 解析.net如何用OleDb方式操作excel
- 談數(shù)據(jù)結(jié)構(gòu)與算法:C#語(yǔ)言描述 目錄
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-怎樣使ASP.NET從字符串中查找字符出現(xiàn)的次數(shù)
。