首页 新闻 会员 周边

谁能告诉我.NET中哪个类型的集合查询速度比较快?

0
[已关闭问题] 关闭于 2017-12-25 10:24

集合会存放大约30W条数据,我会从这个集合里查找数据。

说明:数据是存在文本文件里的(大小不到4M),初始化时逐行读取放入集合;每行就一个词。

var wordModel = words.Where(m => m.Word == strTemp).OrderByDescending(m => m.Word.Length).FirstOrDefault();
屌丝大叔的笔记的主页 屌丝大叔的笔记 | 初学一级 | 园豆:2
提问于:2017-05-26 09:12
< >
分享
所有回答(5)
0

hashset  检索复杂度O(1),你现在这个是O(n)

~扎克伯格 | 园豆:1923 (小虾三级) | 2017-05-26 09:22
0

这么写的话,能快就有鬼了。

爱编程的大叔 | 园豆:30839 (高人七级) | 2017-05-26 09:52

忘记说明了:数据是存在文本文件里的,初始化时逐行读取放入集合;每行就一个词。

支持(0) 反对(0) 屌丝大叔的笔记 | 园豆:2 (初学一级) | 2017-05-26 12:32

@如露如电如梦如幻: 纯粹代码的优化通常只是同样数量级的速度变化,

如果你有场景,比如我假设一个场景吧,

读取一次文件(TXT),查询是几十万次,需要加快查询速度。

那么解决方案就是,

1、读取可以慢点没有关系,慢10倍都行。但是查询要快。

2、在查询中,进行计算会拖慢速度,所以查询时尽量简单

3、增加一个字段,在读取数据的时候,计算字符串长度,保存在字段WordLength里面

4、查询效果

var wordModel = words.Where(m => m.Word == strTemp).OrderByDescending(m => m.WordLength).FirstOrDefault();

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2017-06-01 09:59
0

内存都要爆炸了吧

hahanonym | 园豆:1460 (小虾三级) | 2017-05-26 10:54

忘记说明了:数据是存在文本文件里的,初始化时逐行读取放入集合;每行就一个词。

支持(0) 反对(0) 屌丝大叔的笔记 | 园豆:2 (初学一级) | 2017-05-26 12:32
0

你这情况和什么集合类型都没关系.和索引有关.

你没有索引.他自然只能遍历.

如果写linq的人不是傻的.那你可以先排序再查询.能提高每次查询的性能.

比如words=words.OrderBy(m=>m.Word).ThenByDescending(m => m.Word.Length);

然后再var wordModel = words.Where(m => m.Word == strTemp).OrderByDescending(m => m.Word.Length).FirstOrDefault();效率就会高一些.

如果linq默认没对以排序集合做查询优化.那你就自己写个折半查找

吴瑞祥 | 园豆:29449 (高人七级) | 2017-05-26 13:42

刚才按你说的试了一把,被你说中了:linq没有对已排序集合做查询优化。

这么做了反而更慢。

支持(0) 反对(0) 屌丝大叔的笔记 | 园豆:2 (初学一级) | 2017-05-26 15:31

@如露如电如梦如幻: 我上面的代码有问题.不能words=words.

得要var odwords=words. 弄一个新的.这样他的,类型才是已排序集合.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-05-26 15:36

@吴瑞祥: 刚才1400毫秒左右,现在400毫秒左右。

但是还是不如啥也没干的快,240毫秒左右。

支持(0) 反对(0) 屌丝大叔的笔记 | 园豆:2 (初学一级) | 2017-05-26 16:05

@如露如电如梦如幻: 这个是肯定的.他这个是第一次会慢.因为要排序.后面你再查询就会变快.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-05-26 16:28
0

没有重复的话,一次只查询一条,用字典类Dictionary合适一点

PFly | 园豆:96 (初学一级) | 2017-05-26 14:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册