我有一个缓存在内存中的DataTable /集合,我想以此为源来生成自动完成文本框的结果(当然使用AJAX)。
我正在评估各种选项,以快速获取数据。
数据表中的收集/行中的项目数可能从10000到2,000,000不等。 (这样一来,我们就不会再改头换面了,因为目前假定已做出决定,我有足够的RAM,并且我将为此使用缓存而不是数据库查询)
对于此处理,我还有一些其他业务逻辑。我必须根据集合中的priority
列(int)来确定自动完成列表的优先级。因此,如果有人搜索Micro
,然后说20个以Micro
开头的单词/句子的结果,那么我将选择优先级最高的10个结果项。 (因此需要具有与字符串值关联的优先级属性)。
收集项已按字母顺序排序。
在这种情况下最好的解决方案是什么。
1.使用DataTable.Select(。
2. Using DataTable.Rows.Find(。
3.将自定义集合与foreach or for一起使用以遍历其值。
4.将通用集合与anonymous delegates或lambda(since both give same performance或not?)一起使用
最佳答案
这些图表未发布在我的博客条目中;更多详细信息,请参见http://msdn.microsoft.com/en-us/library/dd364983.aspx
从那以后,我发现的另一件事是,对于大型数据集,使用链接的通用字典的效果非常好。它还有助于减轻由聚合操作所需的排序操作引起的许多问题,例如最小值和最大值(使用DataTable.Compute
或LINQ
)。
“链式通用词典”是指Dictionary(Of String, Dictionary(Of String, Dictionary(Of Integer, List(Of DataRow))))
或类似技术,其中每个词典的关键字都是搜索词。
当然,这并不是在所有情况下都有用,但是我至少有一种情况可以实现此方法,从而导致500x
性能提高。
对于您的情况,我考虑使用前1-5个字符的简单字典,然后使用List(Of String)
。您只需要构建一次该词典,然后将单词添加到前1-5个字符的列表中,但是此后您将能够获得非常快的结果。
我通常将此类内容包装在一个类中,该类使我可以轻松地进行添加单词之类的操作。您可能还想使用SortedList(Of String)
来使结果自动排序。这样,您可以快速查找与已键入的前N个字符匹配的单词列表。
关于.net - DataTable.Select与DataTable.rows.Find,foreach,Find(Predicate <T>)/Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/626679/