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

时间:2009-03-09 15:25:48

标签: .net optimization lambda anonymous-methods

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

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

收集品已按字母顺序排序。

在这种情况下,最佳解决方案是什么 1.使用DataTable.Select(。
2. Using DataTable.Rows.Find(
3.使用foreach or for的自定义集合来迭代其值 4.使用anonymous delegates或lambda(since both give same performancenot的通用集合?)

5 个答案:

答案 0 :(得分:8)

图表未发布在我的博客文章中;更多详情可在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个字符匹配的单词列表。

答案 1 :(得分:4)

在我的autocomplete上,我首先尝试了linq/lambda方法,但性能有点慢。 DataTable.Selectlinq快,所以我使用它。我还没有比较datatable.Selectdatatable.Find

之间的效果

答案 2 :(得分:2)

我们可以整天推测它,但由于这不是一段很大的代码,为什么不写下每一个代码并将它们相互对照呢?

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();
}

答案 3 :(得分:1)

根据以下博客

http://blog.dotnetspeech.net/archive/2008/08/26/performance----datatable.select-vs-dictionary.aspx

DataTable.Rows.Find比DataTable.Select快得多。

答案 4 :(得分:0)

DataView怎么样?您可以应用过滤条件并按优先级排序,并轻松迭代结果以添加到结果中。