首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<T> FirstOrDefault()性能不佳-字典在这种情况下可能吗?

List<T> FirstOrDefault()性能不佳-字典在这种情况下可能吗?
EN

Stack Overflow用户
提问于 2011-01-26 22:24:52
回答 4查看 3.7K关注 0票数 3

我有一组在特定时间段内有效的“代码”Z。

因为我在大型循环(million+)中需要它们很多次,并且每次我必须查找相应的代码时,我都将它们缓存在List<>中。找到正确的代码后,我将(使用SqlBulkCopy)插入一百万行。

我用下面的代码查找id (l_z是一个List<T>)

代码语言:javascript
复制
var z_fk = (from z in l_z
            where z.CODE == lookupCode &&
                  z.VALIDFROM <= lookupDate &&
                  z.VALIDUNTIL >= lookupDate 
            select z.id).SingleOrDefault();

在其他情况下,我使用了性能卓越的字典,但在这些情况下,我只需根据代码查找id。

但现在在搜索字段组合时,我被卡住了。

有什么想法吗?提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-26 22:27:37

创建一个字典,其中存储每个查找代码的项目列表- Dictionary<string, List<Code>> (假设查找代码是一个字符串,并且对象的类型是代码)。

然后,当您需要基于lookupDate进行查询时,您可以直接从dict[lookupCode]运行查询

代码语言:javascript
复制
var z_fk = (from z in dict[lookupCode]
            where z.VALIDFROM <= lookupDate &&
                  z.VALIDUNTIL >= lookupDate 
            select z.id).SingleOrDefault();

然后,只要确保每当您有一个新的Code对象时,它就会被添加到与该lookupCode对应的dict中的List<Code>集合中(如果不存在,则创建它)。

票数 4
EN

Stack Overflow用户

发布于 2011-01-26 22:42:26

一个简单的改进是使用..。

代码语言:javascript
复制
//in initialization somewhere
ILookup<string, T> l_z_lookup = l_z.ToLookup(z=>z.CODE);

//your repeated code:
var z_fk = (from z in lookup[lookupCode]
            where z.VALIDFROM <= lookupDate && z.VALIDUNTIL >= lookupDate 
            select z.id).SingleOrDefault();

您还可以进一步使用更复杂、更智能的数据结构,以排序的方式存储日期,并使用二进制搜索来查找id,但这可能就足够了。此外,您谈到了SqlBulkCopy -如果您正在处理数据库,也许您可以在数据库上执行查询,然后简单地创建适当的索引,包括CODE、VALIDUNTIL和VALIDFROM列。

我通常更喜欢使用Lookup而不是包含ListsDictionary,因为它构造起来很简单,而且有一个更干净的应用程序接口(例如,当没有键的时候)。

票数 4
EN

Stack Overflow用户

发布于 2011-01-26 22:37:16

对我来说,这听起来像是一种情况,所有这些都可以通过一条语句在数据库上发生。然后,您可以使用索引来保持查询速度,并避免必须通过网络将数据推送到数据库或从数据库推送数据。

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

https://stackoverflow.com/questions/4805605

复制
相关文章

相似问题

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