.net - DataTable.Select与DataTable.rows.Find,foreach,Find(Predicate <T>)/Lambda

标签 .net optimization lambda anonymous-methods

我有一个缓存在内存中的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 performancenot?)一起使用

最佳答案

这些图表未发布在我的博客条目中;更多详细信息,请参见http://msdn.microsoft.com/en-us/library/dd364983.aspx

从那以后,我发现的另一件事是,对于大型数据集,使用链接的通用字典的效果非常好。它还有助于减轻由聚合操作所需的排序操作引起的许多问题,例如最小值和最大值(使用DataTable.ComputeLINQ)。

“链式通用词典”是指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/

相关文章:

c# - 如何从linq中的子表中选择列

ruby - 测试 lambda

Java 8 Lambda 表达式 - 嵌套类中的多个方法怎么样

c# - 在一个对象中初始化一个集合?

c# - 必须在 ListView 'ListView1' 上定义 ItemTemplate。有人帮我解决这个错误

c# - 为什么 BinaryWriter 在处理时关闭外部 Stream,以及如何防止这种情况发生? (.NET C#)

sql - Postgres pg_trgm GIN 索引在特定连接中被忽略

math - O(n) 是否大于 O(2^log n)

python - 如何概括这个类?

Java 8 流映射到按值排序的键列表