首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在datatable上添加主键

在datatable上添加主键
EN

Stack Overflow用户
提问于 2015-05-05 19:15:35
回答 1查看 630关注 0票数 2

我一直在尝试通过向表中添加一个主键来提高DataTable.Select的性能,但是仅仅1200行就花费了太多的时间。使用主键和不使用主键的时间差只有3-4秒(对于DataTable.Select)。

现在,据我所知,Linq的性能肯定不会受到主键添加的影响。由于创建了Datarow集合数组,这对我来说性能是无用的,我想这是瓶颈。

那么主键在这里有什么用呢?

EN

回答 1

Stack Overflow用户

发布于 2015-05-05 19:59:14

DataTable的主键确实在内部维护了一个独立于行顺序的索引,您说得对,Select可以进行优化,将主键上的过滤器视为特殊情况。不幸的是,还没有这样做,Select只是一个接一个地遍历所有记录,并评估过滤器。

这仍然比您的LINQ版本慢的原因是,您作为字符串传递的过滤器首先需要解析,然后将其转换为表达式树(而不是表达式树的LINQ版本),然后表达式求值器充当解释器。您的LINQ版本会生成执行筛选的CIL代码,这些代码将在运行时转换为本机代码。不需要翻译器。

您可以通过使用DataRowCollection.Find获得主键的好处

代码语言:javascript
复制
var rows = lst.Select(key => dtsrc.Rows.Find(key)).Where(row => row != null).ToList();

如果lst可能包含重复的键,则需要首先删除它们。您可以使用Enumerable.Distinct()方法,也可以从一开始就使用HashSet<int> (如果您不关心行的顺序)。

(我早些时候声称Select方法不能优化,因为主键信息没有以任何方法保存,方法可以利用,但我错了,如我的示例所示。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30051467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档