当前位置:  开发笔记 > 前端 > 正文

DataTable.Select vs DataTable.rows.Find vs foreach vs Find(Predicate <T>)/ Lambda

如何解决《DataTable.SelectvsDataTable.rows.FindvsforeachvsFind(Predicate<T>)/Lambda》经验,为你挑选了1个好方法。

我有一个缓存在内存中的DataTable /集合,我想用它作为源来生成自动完成文本框的结果(当然使用AJAX).我正在评估各种选项以快速获取数据.数据表中集合/行中的项目数可以从10000到2,000,000不等.(因此,我们不会转移,暂时假设已做出决定,我有足够的RAM,我将使用缓存而不是数据库查询)

我有一些额外的业务逻辑用于此处理; 我必须priority根据集合中的列(int)确定自动完成列表的优先级.因此,如果我有人搜索Micro并且我会说出20个以单词/句子开头的结果,Micro那么我会选择具有最高优先级的前10个结果项.(因此需要具有与字符串值相关联的优先级属性).

集合项已按字母顺序排序.

在这种情况下,什么是最好的解决方案.
1.使用DataTable.Select(
2. 使用DataTable.Rows.Find( .
3.使用自定义集合与的foreach或通过其值进行迭代.
4.使用泛型集合与匿名委托或lambda(因为两者给予同样的性能或不?)



1> 小智..:

这些图表不会发布在我的博客文章中; 更多详细信息可以在http://msdn.microsoft.com/en-us/library/dd364983.aspx找到

我之后发现的另一件事是,对于大型数据集,使用链式通用字典表现非常好.它还有助于缓解聚合操作(如min和max(使用DataTable.ComputeLINQ)所需的排序操作所导致的许多问题.

通过"链式通用字典",我的意思是一种Dictionary(Of String, Dictionary(Of String, Dictionary(Of Integer, List(Of DataRow))))或类似的技术,其中每个字典的关键字是搜索项.

当然,这在所有情况下都没有用,但我至少有一种情况,即实施这种方法可以500x提高性能.

在你的情况下,我会考虑使用一个前1-5个字符的简单字典,然后是a List(Of String).你必须建立一次这个字典,将这些单词添加到前1-5个字符的列表中,但之后你将能够获得超快的结果.

我通常将这样的东西包装在一个允许我轻松添加单词的类中.您可能还想使用a SortedList(Of String)来自动排序结果.这样,您可以快速查找与已键入的前N个字符匹配的单词列表.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有