我们在做项目时,可能会遇到这样的需求,比如判断,1,2,3,33,22,123, 中是否存在,3,。

var str=",1,2,3,33,22,123,";

一般有几种方式:

1、str.IndexOf(",3,")>=0

2、str.Contains(",3,")

有可能我们不用字符串而用List来存,判断list中是否存在3

var list = str.Split(',').ToList();

3、list.Contains("3");

4、List.Any(t=>t=="3");

接下来就验证一下上面4种方案究竟哪种效率最高?

  1. public void Test()
  2. {
  3. var str = "article.add,article.update,article.delete,article.view," +
  4. "category.add,category.update,category.delete,category.view," +
  5. "user.add,user.update,user.delete,user.view," +
  6. "role.add,role.update,role.delete,role.view," +
  7. "news.add,news.update,news.delete,news.view," +
  8. "category.add,category.update,category.delete,category.view," +
  9. "Threading.add,Threading.update,Threading.delete,Threading.view," +
  10. "System.add,System.update,System.delete,System.view," +
  11. "Generic.add,Generic.update,Generic.delete,Generic.view," +
  12. "Collections.add,Collections.update,Collections.delete,Collections.view," +
  13. "Tasks.add,Tasks.update,Tasks.delete,Tasks.view," +
  14. "CslApp.add,CslApp.update,CslApp.delete,CslApp.view";
  15. var list = str.Split(',').ToList();
  16.  
  17. var str1 = "Tasks2.view"; //这里查询一个不存在的字符串,这样更费时,如果字符串存在,话费的时间要少些。
  18. var count = 100000;
  19. Stopwatch sw = new Stopwatch();
  20. sw.Start();
  21. //耗时巨大的代码
  22. for (int i = 0; i < count; i++)
  23. {
  24. if (str.Contains(str1)) { }
  25. }
  26. sw.Stop();
  27. TimeSpan ts = sw.Elapsed;
  28. Console.WriteLine("string.contains总共花费{0}ms.", ts.TotalMilliseconds);
  29.  
  30. Stopwatch sw2 = new Stopwatch();
  31. sw2.Start();
  32. //耗时巨大的代码
  33. for (int i = 0; i < count; i++)
  34. {
  35. if (list.Contains(str1)) { }
  36. }
  37. sw2.Stop();
  38. TimeSpan ts2 = sw2.Elapsed;
  39. Console.WriteLine("List.Contains总共花费{0}ms.", ts2.TotalMilliseconds);
  40.  
  41. Stopwatch sw3 = new Stopwatch();
  42. sw3.Start();
  43. //耗时巨大的代码
  44. for (int i = 0; i < count; i++)
  45. {
  46. if (list.Any(t=>t == str1)) { }
  47. }
  48. sw3.Stop();
  49. TimeSpan ts3 = sw3.Elapsed;
  50. Console.WriteLine("List.Any总共花费{0}ms.", ts3.TotalMilliseconds);
  51.  
  52. Stopwatch sw4 = new Stopwatch();
  53. sw4.Start();
  54. //耗时巨大的代码
  55. for (int i = 0; i < count; i++)
  56. {
  57. if (str.IndexOf(str1)>=0) { }
  58. }
  59. sw4.Stop();
  60. TimeSpan ts4 = sw4.Elapsed;
  61. Console.WriteLine("string.IndexOf总共花费{0}ms.", ts4.TotalMilliseconds);
  62.  
  63. }

  这里分别循环十万次来测试,得到的结果:

可以看出,IndexOf >=0这种方式简直是灾难性的存在,

效率最高的是将字符串转成List在用List.Contains判断,

List.Any查询效率都远不如string.Contains和List.Contains。

下面运行100万次的结果,由于indexof效率实在太差太费时间,就去掉了这个判断,

可见,转换成List在用list.Contains判断效率是最高的。

判断字符串中是否存在的几种方案:string.indexof、string.contains、list.contains、list.any几种方式效率对比的更多相关文章

  1. 使用HashMap或Hashset优化使用循环判断字符串中是否含有重复元素

    原本遇到判断字符串中是否含有重复元素的问题总是使用for循环遍历进行判断,这一方法则需要O(n3)的时间复杂度,如果本身方法处于几个循环中,就会指数倍增加时间复杂度.类似于如下代码: String[] ...

  2. PHP判断字符串中是否包含指定字符串,支持中文哦

    RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...

  3. 判断字符串中是否有SQL攻击代码

    判断一个输入框中是否有SQL攻击代码 public const string SQLSTR2 = @"exec|cast|convert|set|insert|select|delete|u ...

  4. [C#]判断字符串中是否包含中文

    关键代码: /// <summary> /// 判断字符串中是否包含中文 /// </summary> /// <param name="str"&g ...

  5. PHP判断字符串中是否含有中文

    <?php $str = "测试中文"; echo $str; echo "<hr>"; //if (preg_match("/^[ ...

  6. 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题

    #方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...

  7. java判断字符串中是否包含中文 过滤中文

    package com.test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test ...

  8. Python如何判断字符串中是否有中文

    解决:Python如何判断字符串中是否有中文 In [240]: s Out[240]: '你好aa' In [241]: for i in s: ...: if u'\u4e00' <= i ...

  9. java 判断字符串中是否包含中文并过滤掉中文

      java判断字符串中是否包含中文并过滤掉中文 CreateTime--2017年9月6日08:48:59 Author:Marydon 1.判断字符串中是否包含中文方法封装 /** * 判断字符串 ...

  10. java判断字符串中是否含有中文

    /** * 判断字符串中是否含有中文 */ public static boolean isCNChar(String s){ boolean booleanValue = false; for(in ...

随机推荐

  1. 关于if与switch的使用与区别

    这是if语句: if (条件表达式1){ //条件判断 //n多语句1 }else if(条件表达式2){ //n多语句2 }else if(条件表达式3){ //n多语句3 } ... ... el ...

  2. day 90 DjangoRestFramework学习二之序列化组件

      DjangoRestFramework学习二之序列化组件   本节目录 一 序列化组件 二 xxx 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 首先按照 ...

  3. Python3中高阶函数lambda,filter,map,reduce,zip的详细用法

    在Python里有五大高阶函数,他们分别是lambda()匿名函数,filter()筛选函数,map()函数,reduce()函数,zip()函数.下面就让我们来详细的了解一下这五种函数的具体用法吧. ...

  4. 使用jdk生成自签发证书(过程总结)

    前言: 最近在做华为NB-IoT接口开发,需要用到双向认证,就去学了一下. 然后我将过程总结了一下. 相关华为论坛链接:http://developer.huawei.com/ict/forum/th ...

  5. uva 210 - Concurrency Simulator (并行程序模拟)

    from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...

  6. uva 156 - Ananagrams (反片语)

    csdn:https://blog.csdn.net/su_cicada/article/details/86710107 例题5-4 反片语(Ananagrams,Uva 156) 输入一些单词,找 ...

  7. cgywin下 hadoop运行 问题

    1 cgywin下安装hadoop需要配置JAVA_home变量 ,  此时使用 window下安装的jdk就可以  ,但是安装路径不要带有空格.否则会不识别. 2  在Window下启动Hadoop ...

  8. 20155233 《Java程序设计》 第十一周课堂练习总结

    20155233 <Java程序设计> 第十一周课堂练习总结 测试题目 1.修改教材P74 一行代码 NineNineTable.java, 让执行结果是个三角形: 提交在IDEA或命令行 ...

  9. Kali linux 安装

    df -m umount  /media exit

  10. .net core 无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了

    使用vs 发布.net CORE 项目,调试遇到了“无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了”这个问题,弄了半天才发现是发布的时候没有设置为debug,做个总 ...