C#判斷字符串中是否包含指定字符串及contains與indexof方法效率問(wèn)題
正文
#方法一:使用string.Contains方法
string.Contains是大小寫(xiě)敏感的,如果要用該方法來(lái)判斷一個(gè)string是否包含某個(gè)關(guān)鍵字keyword,需要把這個(gè)string和這個(gè)keyword都轉(zhuǎn)成小寫(xiě)或大寫(xiě)再調(diào)用Contains方法;
string key = "bbb"; string temp = "aaaBBBcccDDD"; bool isContains= temp.ToLower().Contains(key.ToLower());//true
#方法二:使用sring.Index方法
使用string.Index方法,然后通過(guò)StringComparison.OrdinalIgnoreCase
指定查找過(guò)程忽略大小寫(xiě);
string key = "bbb"; string temp = "aaaBBBcccDDD"; bool isContains = temp.IndexOf(key,StringComparison.OrdinalIgnoreCase)>=0;//true
#那什么時(shí)候使用Contains方法,什么時(shí)候使用Index方法,哪個(gè)效率高?
1、測(cè)試代碼:
注:此測(cè)試針對(duì)的是擁有大量英文的情況下,并且指定的字符串為英文
每個(gè)方法測(cè)試1千萬(wàn)次,輸出所用時(shí)間;
class Program { private const int N = 10000000; private static Stopwatch watch = new Stopwatch(); static void Main(string[] args) { string source = "aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqq"; string target = "AAA"; Console.WriteLine("目標(biāo)在開(kāi)頭部分時(shí):"); Console.WriteLine("不區(qū)分大小寫(xiě):"); TestContains(source, target,true); TestIndexOf(source, target,true); Console.WriteLine("區(qū)分大小寫(xiě):"); target = "aaa"; TestContains(source, target,false); TestIndexOf(source, target,false); Console.WriteLine(); Console.WriteLine("目標(biāo)在中部時(shí):"); Console.WriteLine("不區(qū)分大小寫(xiě):"); target = "HHH"; TestContains(source, target, true); TestIndexOf(source, target, true); Console.WriteLine("區(qū)分大小寫(xiě):"); target = "hhh"; TestContains(source, target, false); TestIndexOf(source, target, false); Console.WriteLine(); Console.WriteLine("目標(biāo)在結(jié)尾時(shí):"); Console.WriteLine("不區(qū)分大小寫(xiě):"); target = "QQQ"; TestContains(source, target,true); TestIndexOf(source, target,true); Console.WriteLine("區(qū)分大小寫(xiě):"); target = "qqq"; TestContains(source, target,false); TestIndexOf(source, target,false); Console.WriteLine("執(zhí)行完畢,按任意鍵退出..."); Console.ReadKey(); } private static void TestIndexOf(string source, string target,bool isIgnoreCase) { watch.Reset(); watch.Start(); for (int i = 0; i < N; i++) { if (isIgnoreCase) source.IndexOf(target, StringComparison.OrdinalIgnoreCase); else source.IndexOf(target); } watch.Stop(); Console.WriteLine("IndexOf: " + watch.ElapsedMilliseconds.ToString() + "ms"); return; } private static void TestContains(string source, string target,bool isIgnoreCase) { watch.Reset(); watch.Start(); for (int i = 0; i < N; i++) { if (isIgnoreCase) source.ToLower().Contains(target.ToLower()); else source.Contains(target); } watch.Stop(); Console.WriteLine("Contains: " + watch.ElapsedMilliseconds.ToString() + "ms"); return; } }
2、測(cè)試結(jié)果:
3、總結(jié)
1、從測(cè)試結(jié)果(大量測(cè)試)中能明顯看出,當(dāng)擁有大量英文的字符串中:
*當(dāng)不區(qū)分大小寫(xiě)時(shí),string.IndexOf方法的效率明顯高于string.Contains方法;
*當(dāng)區(qū)分大小寫(xiě)時(shí),string.Contains方法的效率明顯高于string.IndexOf方法;
*如果判斷的是中文,沒(méi)有大小寫(xiě)之分,還是string.Contains方法的效率高;
2、綜合上述總結(jié),定義了一個(gè)String擴(kuò)展方法,該方法包含一個(gè)StringComparison參數(shù),返回值為是否包含子字符串:
using System; public static class StringExtensions { public static bool Contains(this String str, String substring, StringComparison comp) { if (substring == null) throw new ArgumentNullException("substring", "substring cannot be null."); else if (! Enum.IsDefined(typeof(StringComparison), comp)) throw new ArgumentException("comp is not a member of StringComparison", "comp"); return str.IndexOf(substring, comp) >= ; } } using System; public class Example { public static void Main() { String s = "This is a string."; String sub1 = "this"; Console.WriteLine("Does '{0}' contain '{1}'?", s, sub1); StringComparison comp = StringComparison.Ordinal; Console.WriteLine(" {0:G}: {1}", comp, s.Contains(sub1, comp)); comp = StringComparison.OrdinalIgnoreCase; Console.WriteLine(" {0:G}: {1}", comp, s.Contains(sub1, comp)); } } // The example displays the following output: // Does 'This is a string.' contain 'this'? // Ordinal: False // OrdinalIgnoreCase: True
總結(jié)
以上所述是小編給大家介紹的C#判斷字符串中是否包含指定字符串及contains與indexof方法效率問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
- 如何解決Mybatis--java.lang.IllegalArgumentException: Result Maps collection already contains value for X
- Python extract及contains方法代碼實(shí)例
- javascript中contains是否包含功能實(shí)現(xiàn)代碼(擴(kuò)展字符、數(shù)組、dom)
- Oracle 中Contains 函數(shù)的用法
- jQuery使用contains過(guò)濾器實(shí)現(xiàn)精確匹配方法詳解
- JavaScript中擴(kuò)展Array contains方法實(shí)例
- jQuery實(shí)現(xiàn)contains方法不區(qū)分大小寫(xiě)的方法
- jQuery中:contains選擇器用法實(shí)例
- PowerShell Contains函數(shù)查找字符串實(shí)例
- Java contains用法示例
相關(guān)文章
Unity ScrollView實(shí)現(xiàn)無(wú)限循環(huán)效果
這篇文章主要為大家詳細(xì)介紹了Unity ScrollView實(shí)現(xiàn)無(wú)限循環(huán)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07動(dòng)態(tài)改變gridview列寬度函數(shù)分享
通常用GridView綁定datatable,由于需要?jiǎng)討B(tài)綁定到不同的datatable所以需要?jiǎng)討B(tài)調(diào)整GridView的寬度。寫(xiě)了這個(gè)函數(shù)實(shí)現(xiàn)該功能2014-01-01Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換
這篇文章主要介紹了Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換的示例代碼,幫助大家更好的理解和使用winform開(kāi)發(fā),感興趣的朋友可以了解下2020-12-12C#創(chuàng)建windows系統(tǒng)用戶的方法
這篇文章主要介紹了C#創(chuàng)建windows系統(tǒng)用戶的方法,涉及C#操作用戶名、密碼、顯示名稱、描述、是否強(qiáng)制修改密碼、密碼是否過(guò)期等技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04C#實(shí)現(xiàn)簡(jiǎn)易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)
本文主要介紹了C#實(shí)現(xiàn)簡(jiǎn)易灰度圖和酷炫HeatMap熱力圖winform(附DEMO),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Unity實(shí)現(xiàn)卡片循環(huán)滾動(dòng)效果的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Unity實(shí)現(xiàn)卡片循環(huán)滾動(dòng)的效果,文中的實(shí)現(xiàn)步驟講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-12-12C#實(shí)現(xiàn)Excel導(dǎo)入sqlite的方法
這篇文章主要介紹了C#實(shí)現(xiàn)Excel導(dǎo)入sqlite的方法,是C#程序設(shè)計(jì)中非常重要的一個(gè)實(shí)用技巧,需要的朋友可以參考下2014-09-09c#通過(guò)反射實(shí)現(xiàn)對(duì)象自動(dòng)映射的實(shí)現(xiàn)
本文主要介紹了c#通過(guò)反射完成對(duì)象自動(dòng)映射的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02