我们在做项目时,可能会遇到这样的需求,比如判断,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种方案究竟哪种效率最高?

public void Test()
{
var str = "article.add,article.update,article.delete,article.view," +
"category.add,category.update,category.delete,category.view," +
"user.add,user.update,user.delete,user.view," +
"role.add,role.update,role.delete,role.view," +
"news.add,news.update,news.delete,news.view," +
"category.add,category.update,category.delete,category.view," +
"Threading.add,Threading.update,Threading.delete,Threading.view," +
"System.add,System.update,System.delete,System.view," +
"Generic.add,Generic.update,Generic.delete,Generic.view," +
"Collections.add,Collections.update,Collections.delete,Collections.view," +
"Tasks.add,Tasks.update,Tasks.delete,Tasks.view," +
"CslApp.add,CslApp.update,CslApp.delete,CslApp.view";
var list = str.Split(',').ToList(); var str1 = "Tasks2.view"; //这里查询一个不存在的字符串,这样更费时,如果字符串存在,话费的时间要少些。
var count = 100000;
Stopwatch sw = new Stopwatch();
sw.Start();
//耗时巨大的代码
for (int i = 0; i < count; i++)
{
if (str.Contains(str1)) { }
}
sw.Stop();
TimeSpan ts = sw.Elapsed;
Console.WriteLine("string.contains总共花费{0}ms.", ts.TotalMilliseconds); Stopwatch sw2 = new Stopwatch();
sw2.Start();
//耗时巨大的代码
for (int i = 0; i < count; i++)
{
if (list.Contains(str1)) { }
}
sw2.Stop();
TimeSpan ts2 = sw2.Elapsed;
Console.WriteLine("List.Contains总共花费{0}ms.", ts2.TotalMilliseconds); Stopwatch sw3 = new Stopwatch();
sw3.Start();
//耗时巨大的代码
for (int i = 0; i < count; i++)
{
if (list.Any(t=>t == str1)) { }
}
sw3.Stop();
TimeSpan ts3 = sw3.Elapsed;
Console.WriteLine("List.Any总共花费{0}ms.", ts3.TotalMilliseconds); Stopwatch sw4 = new Stopwatch();
sw4.Start();
//耗时巨大的代码
for (int i = 0; i < count; i++)
{
if (str.IndexOf(str1)>=0) { }
}
sw4.Stop();
TimeSpan ts4 = sw4.Elapsed;
Console.WriteLine("string.IndexOf总共花费{0}ms.", ts4.TotalMilliseconds); }

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

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

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

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

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

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

最新文章

  1. JavaScript DOM编程艺术读书笔记(二)
  2. x01.Game.LitSkull: 梯次防御
  3. 求height数组
  4. JQuery1.11版本对prop和attr接口的含义分离导致问题分析
  5. mysql 日期格式化
  6. Splay!
  7. sqlserver修改某列为行号
  8. hdu 5586 Sum(dp+技巧)
  9. Android 手机上安装并运行 Ubuntu 12.04
  10. 转载python并行运算实例
  11. 线段树解决leetcode307. Range Sum Query - Mutable
  12. 【nginx】nginx解决跨域详解
  13. sau交流学习社区--songEagle开发系列:Vue.js + Koa.js项目中使用JWT认证
  14. kill、killall、pkill杀手三人组
  15. 【PyQt5-Qt Designer】对话框系列
  16. react native初识
  17. sqlserver使用SQL语句创建数据库登录对象、数据库用户以及对为该用户赋予操作权限
  18. compatible with
  19. Jquery map()
  20. php环境重启

热门文章

  1. HIve安装模式
  2. java 8 更优雅的判断是否为空
  3. 20155217 2016-2017-2 《Java程序设计》第3周学习总结
  4. 《JAVA程序设计》 20155208 实验四 Android程序设计
  5. 20155302 2016-2017-2 《Java程序设计》第二周学习总结
  6. 学号 2016-2017-20155329《Java程序设计》课程总结
  7. [bzoj1564]二叉查找树
  8. equals和==方法比较(二)--Long中equals源码分析
  9. 【sed】常用命令
  10. 不相交集合ADT -数据结构(C语言实现)