C#判断字符串中是否包含指定字符串及contains与indexof方法效率问

2020-01-05 09:34:26王振洲

正文

 #方法一:使用string.Contains方法

  string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个keyword都转成小写或大写再调用Contains方法;


 string key = "bbb";
 string temp = "aaaBBBcccDDD";
 bool isContains= temp.ToLower().Contains(key.ToLower());//true

#方法二:使用sring.Index方法

  使用string.Index方法,然后通过StringComparison.OrdinalIgnoreCase指定查找过程忽略大小写;


 string key = "bbb";
 string temp = "aaaBBBcccDDD";
 bool isContains = temp.IndexOf(key,StringComparison.OrdinalIgnoreCase)>=0;//true

 #那什么时候使用Contains方法,什么时候使用Index方法,哪个效率高?

1、测试代码:

  注:此测试针对的是拥有大量英文的情况下,并且指定的字符串为英文

  每个方法测试1千万次,输出所用时间;


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("目标在开头部分时:");
      Console.WriteLine("不区分大小写:");
      TestContains(source, target,true);
      TestIndexOf(source, target,true);
      Console.WriteLine("区分大小写:");
      target = "aaa";
      TestContains(source, target,false);
      TestIndexOf(source, target,false);
      Console.WriteLine();
      Console.WriteLine("目标在中部时:");
      Console.WriteLine("不区分大小写:");
      target = "HHH";
      TestContains(source, target, true);
      TestIndexOf(source, target, true);
      Console.WriteLine("区分大小写:");
      target = "hhh";
      TestContains(source, target, false);
      TestIndexOf(source, target, false);
      Console.WriteLine();
      Console.WriteLine("目标在结尾时:");
      Console.WriteLine("不区分大小写:");
      target = "QQQ";
      TestContains(source, target,true);
      TestIndexOf(source, target,true);
      Console.WriteLine("区分大小写:");
      target = "qqq";
      TestContains(source, target,false);
      TestIndexOf(source, target,false);
      Console.WriteLine("执行完毕,按任意键退出...");
      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;
    }
  }