- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想搜索包含关键字的学生姓名,首先我将关键字以逗号分隔,但我发现搜索时间太长。但是当我将这些关键字转换为数组时,它是真实的快。为什么linq搜索效率差别这么大?是数组的问题还是linq的问题?
使用字符串进行搜索
var keyWord="Lyly,Tom,Jack,Rose"; //and so on,more than 500 names
var student= Context.Students.Where(i => keyWord.Contains(i.Name));//very slow
使用数组进行搜索
var keyWord="Lyly,Tom,Jack,Rose"; //and so on,more than 500 names
var keyWordArray=keyWord.split(',');
var student= Context.Students.Where(i => keyWordArray.Contains(i.Name));//fast
最佳答案
是的,就是因为数组。 Linq 数据库提供程序可以将数组转换为一种非常有效的形式。
即,在数据库术语中,
第一个查询将使用 SQL Like , 但第二个查询将使用 SQL IN .它们之间的差异是巨大的。
SQL Like 必须对整个字符串进行全扫描,以满足一个学生的需求。
SQL IN 不必进行任何扫描,因为 IN
在幕后使用集合。
请注意,这仅适用于数据库。如果您使用 Linq2Object
对上述比较进行基准测试,您可能看不到任何差异,可能只有几毫秒。
如果你想让 Linq2Object
也有性能,你应该使用 HashSet
,像这样:
var keyWord = "Lyly,Tom,Jack,Rose";
var keyWordSet = new HashSet<string>(keyWord.split(','));
var students = Context.Students
.ToList()
.Where(i => keyWordSet.Contains(i.Name));
关于c# - 为什么我用string和array,特别是大数据,linq search效率差别这么大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26889335/
我已经可以在其中输入一些附加文本了mydomain/wiki/Special:UserLogin。我添加了一句话: In order to apply for an account send an m
有人可以解释以下脚本输出背后的逻辑吗? import numpy if(numpy.dtype(numpy.float64) == None): print "Surprise!!!!" 谢谢
是我还是 gmail bulls**t?在 outlook/浏览器上,我的电子邮件是完美的,但在 gmail 上,2 个表之间有一个空间,为什么?!?图片:http://i.imgur.com/srJ
我是一名优秀的程序员,十分优秀!