[C#] 找尋字串中是否包含某字詞..
假設字串是 "HELLO,IamAString" 我是搜尋 是否包含 string 這字..
會因為大小寫關係..所以可能會搜尋不到…
所以,我能想到的寫法為這幾種…
1. 使用 IndexOf 判斷
var isContain = "HELLO,IamAString".IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;
2. 先將字串轉成大寫/小寫 之後再用Contains 比對
var isContain = "HELLO,IamAString".ToUpper().Contains("STRING");
3. 使用Regular Expression
var isContain = Regex.Match("HELLO,IamAString", "string", RegexOptions.IgnoreCase).Success;
這時候我在想,哪一個效率比較好,所以做了一個很簡單的測試
我使用一個List 裡面擺物件(剛好正寫到一半的專案就進行測試)
其中的Name 我跑迴圈 放入一百萬筆資料 分別他們的Name 欄位是User1~User1000000 這時候我進行搜尋 ER5 這字串看看哪 個速度比較快
static List<User> sampleUsers = new List<User>();
protected void Page_Load(object sender, EventArgs e)
{
if (sampleUsers.Count == 0)
{
for (int i = 1; i <= 1000000; i++)
{
User user = new User();
user.Name = "User" + i;
sampleUsers.Add(user);
}
}
}
測試IndexOf:
for (int i = 0; i < 9; i++)
{
Stopwatch sw = new Stopwatch();
var count = 0;
sw.Start();
foreach (var user in sampleUsers)
{
if (user.Name.IndexOf("ER5", StringComparison.OrdinalIgnoreCase) >= 0)
count++;
}
sw.Stop();
Response.Write("搜尋到筆數為 "+count + ",耗時:" + sw.Elapsed + "<br />");
}
結果:
搜尋到筆數為 111111,耗時:00:00:00.3266546
搜尋到筆數為 111111,耗時:00:00:00.3344862
搜尋到筆數為 111111,耗時:00:00:00.3284262
搜尋到筆數為 111111,耗時:00:00:00.3217941
搜尋到筆數為 111111,耗時:00:00:00.3196139
搜尋到筆數為 111111,耗時:00:00:00.3177882
搜尋到筆數為 111111,耗時:00:00:00.3178227
搜尋到筆數為 111111,耗時:00:00:00.3191825
搜尋到筆數為 111111,耗時:00:00:00.3193887
測試轉大寫後Contains
for (int i = 0; i < 9; i++)
{
Stopwatch sw = new Stopwatch();
var count = 0;
sw.Start();
foreach (var user in sampleUsers)
{
if (user.Name.ToUpper().Contains("ER5"))
count++;
}
sw.Stop();
Response.Write("搜尋到筆數為 " + count + ",耗時:" + sw.Elapsed + "<br />");
}
結果:
搜尋到筆數為 111111,耗時:00:00:00.4626143
搜尋到筆數為 111111,耗時:00:00:00.4567005
搜尋到筆數為 111111,耗時:00:00:00.4627301
搜尋到筆數為 111111,耗時:00:00:00.4594765
搜尋到筆數為 111111,耗時:00:00:00.4531359
搜尋到筆數為 111111,耗時:00:00:00.4528775
搜尋到筆數為 111111,耗時:00:00:00.4553375
搜尋到筆數為 111111,耗時:00:00:00.4522056
搜尋到筆數為 111111,耗時:00:00:00.4549220
測試Regular Expression
for (int i = 0; i < 9; i++)
{
Stopwatch sw = new Stopwatch();
var count = 0;
sw.Start();
foreach (var user in sampleUsers)
{
if (Regex.Match(user.Name, "ER5", RegexOptions.IgnoreCase).Success)
count++;
}
sw.Stop();
Response.Write("搜尋到筆數為 " + count + ",耗時:" + sw.Elapsed + "<br />");
}
for (int i = 0; i < 9; i++)
{
Stopwatch sw = new Stopwatch();
var count = 0;
sw.Start();
foreach (var user in sampleUsers)
{
if (Regex.Match(user.Name, "ER5", RegexOptions.IgnoreCase).Success)
count++;
}
sw.Stop();
Response.Write("搜尋到筆數為 " + count + ",耗時:" + sw.Elapsed + "<br />");
}
結果:
搜尋到筆數為 111111,耗時:00:00:00.9328328
搜尋到筆數為 111111,耗時:00:00:00.9075349
搜尋到筆數為 111111,耗時:00:00:00.9013914
搜尋到筆數為 111111,耗時:00:00:00.9082882
搜尋到筆數為 111111,耗時:00:00:00.9191573
搜尋到筆數為 111111,耗時:00:00:00.9514691
搜尋到筆數為 111111,耗時:00:00:00.8950844
搜尋到筆數為 111111,耗時:00:00:00.8997800
搜尋到筆數為 111111,耗時:00:00:00.8968974
所以這邊做個小結論 IndexOf 跟 轉大寫後Contains 比對 感覺效果差不多不過IndexOf 表現好點,但是使用Regular Expression 是最差的
不過這是一百萬筆資料的結果..這都在很小很小的範圍內….
參考一下..有點無聊的測試..
標籤:
C#
-- Yesterday I wrote down the code. I bet I could be your hero. I am a mighty little programmer. 如果這篇文章有幫助到您,簡單留個言,或是幫我按個讚,讓我有寫下去的動力...