.net DataTable.Select vs DataTable.rows.Find vs foreach vs Find(谓词<;T>;)/Lambda

.net DataTable.Select vs DataTable.rows.Find vs foreach vs Find(谓词<;T>;)/Lambda,.net,optimization,lambda,anonymous-methods,.net,Optimization,Lambda,Anonymous Methods,我有一个缓存在内存中的数据表/集合,我想用它作为一个源来生成自动完成文本框的结果(当然使用AJAX)。 我正在评估各种选项以快速获取数据。 数据表中集合/行中的项目数可能在10000到2000000之间变化。(这样我们就不会分心,目前假设已经做出决定,我有足够的RAM,我将使用缓存而不是数据库查询) 我有一些用于此处理的附加业务逻辑;我必须根据集合中的priority列(int)对自动完成列表进行优先级排序。因此,如果有人搜索Micro,我会得到20个以Micro开头的单词/句子的结果,然后我会

我有一个缓存在内存中的数据表/集合,我想用它作为一个源来生成自动完成文本框的结果(当然使用AJAX)。 我正在评估各种选项以快速获取数据。 数据表中集合/行中的项目数可能在10000到2000000之间变化。(这样我们就不会分心,目前假设已经做出决定,我有足够的RAM,我将使用缓存而不是数据库查询)

我有一些用于此处理的附加业务逻辑;我必须根据集合中的
priority
列(int)对自动完成列表进行优先级排序。因此,如果有人搜索
Micro
,我会得到20个以
Micro
开头的单词/句子的结果,然后我会选择优先级最高的前10个结果项。(因此需要具有与字符串值关联的优先级属性)

集合项已按字母顺序排序

在这种情况下,最好的解决方案是什么。
1.使用数据表。选择(。
2.
3.使用自定义集合来迭代其值。

4.将通用集合与或lambda(或?)一起使用,我们可以整天推测它,但既然这不是一段庞大的代码,为什么不编写每一段代码并对它们进行相互基准测试呢

public delegate void TestProcedure();

public TimeSpan Benchmark(TestProcedure tp)
{
    int testBatchSize = 5;
    List<TimeSpan> results = new List<TimeSpan>();
    for(int i = 0; i<testBatchSize; i++)
    {
        DateTime start = DateTime.Now;
        tp();
        results.Add(DateTime.Now - start);
    }
    return results.Min();
}
public委托void TestProcedure();
公共时间跨度基准测试(测试过程tp)
{
int testBatchSize=5;
列表结果=新列表();

对于(int i=0;i数据视图如何?您可以应用您的筛选条件并按优先级排序,并轻松地迭代结果以添加到结果中。

在我的
自动完成
上,我首先尝试了
linq/lambda
方法,性能有点慢。
数据表。Select
li更快nq
,所以我使用它。我还没有比较
datatable之间的性能。选择
datatable。根据以下博客查找


DataTable.Rows.Find比DataTable快得多。选择。

图表不会发布在我的博客条目上;有关更多详细信息,请访问

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

所谓“链式通用词典”,我指的是
词典(字符串的、字符串的、整数的、列表的、数据行的))
或类似的技术,其中每个词典的键是一个搜索词

诚然,这并不是在所有情况下都有用,但我至少有一个场景,在这个场景中,实现这种方法可以提高
500x
性能

在你的情况下,我会考虑使用第一个1-5个字符的简单字典,然后使用<<代码>列表(字符串)。你必须建立一次字典,把单词加上第一个1-5个字符的列表,但之后你会得到快速的结果。


我通常把这样的东西包装在一个类中,这样我就可以轻松地添加单词。你也可以使用
SortedList(字符串)
,以自动对结果进行排序。这样,您可以快速查找与键入的前N个字符匹配的单词列表。

是的,问题中的选项2正是这样做的。只要检查是否有人已经完成了这项工作
!如果您进行了基准测试,请让我们知道!我很好奇您将做些什么nd.你对此非常肯定!你在筛选键上有索引吗?海报的问题是关于筛选DataTable。因此数据库索引不能在这里应用。DataTable有内存中的行索引,只能通过DataTable访问。选择(我假设DataTable.Find也可以访问该内部索引).Linq to object无法访问该内部索引,因为在后台Linq to object循环所有元素。除非有人创建使用DataTable的Linq to DataTable提供程序。在内部选择,使用Linq/Lambda从DataTable筛选DataRow仍将令人失望。DataTable架构我的问题是关于DataTable内部索引的x、 另外,根据“索引表为LINQ查询提供了一个小优势”,如果你仔细想想,index和LINQ是一个重载词;-)博客作者是Jeff,他肯定有上面的详细答案和一篇文章。