[C#] 找尋字串中是否包含某字詞..

2012-11-08

 

假設字串是 "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 />");
}


結果:


搜尋到筆數為 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 是最差的
不過這是一百萬筆資料的結果..這都在很小很小的範圍內….


參考一下..有點無聊的測試..


當麻許的超技八 2014 | Donma Hsu Design.