具有大列表的C#Linq性能

具有大列表的C#Linq性能,c#,performance,linq,list,C#,Performance,Linq,List,我有一个应用程序,它基本上获取一个列表(由用户提交),并为列表中的每个项目返回一组数据。我的主要问题是,我在内存中存储了一个大型集合,以避免每次查询数据库的成本,但每次查询仍需要将近0.5秒,这太长了 该收藏是美国和CA的邮政编码,拥有近100万条记录。用户的列表从几十条到几千条记录不等,我需要为每一条记录都这样做,因此使用大型列表会非常耗时。以下是查询: var resultList = PostalCodeList.Where(p => p.postalcode == userPost

我有一个应用程序,它基本上获取一个列表(由用户提交),并为列表中的每个项目返回一组数据。我的主要问题是,我在内存中存储了一个大型集合,以避免每次查询数据库的成本,但每次查询仍需要将近0.5秒,这太长了

该收藏是美国和CA的邮政编码,拥有近100万条记录。用户的列表从几十条到几千条记录不等,我需要为每一条记录都这样做,因此使用大型列表会非常耗时。以下是查询:

var resultList = PostalCodeList.Where(p => p.postalcode == userPostalCode).ToList();
邮政编码列表还有其他相关数据(国家、地区等),也需要返回给用户。总共有5个字段。所有字符串

根据数据的组织方式,对于给定的值,可能有两个结果,因此我需要对此进行说明


任何想法或建议都很好。谢谢

查询数据库会影响性能,还是出于对数据库的恐惧而将数据缓存在这里?如果是后者,您可能会发现单个查询更适合您的需要,并且只有在遇到DB性能问题时才应该进行优化

也就是说,您可能不必要地使用了
ToList()
。如果您对结果所做的只是
foreach
,那么您所做的就是枚举集合两次(一次用于
ToList()
,第二次用于
foreach
)。如果可能,请删除
ToList()
,直接使用
Where()
的结果。如果列表的迭代是主要的开销,那么您应该会发现这会将查找时间减少一半左右


除此之外,正如其他人在他们对原始问题的评论中所述,您可能会发现,切换到支持快速查找(即哈希集)的方法是完全避开O(n)的唯一方法随着集合的增长,您将遇到的查找时间。

如何显示用于填充和/或返回列表将使用的数据的查询。。您还检查了数据库是否针对特定的表进行了优化。是否需要添加索引或缺少索引…等等…?我会使用
字典
来存储信息(而不是列表)。@DJKRAZE,列表使用的数据在内存中,因此程序不必为接收到的列表上的每个元素查询数据库使用字典或哈希集,这是用于快速查找的。我认为您的基本假设是错误的。通过将所有内容都保存在本地内存中,不一定会加快处理速度。这样的查找是数据库设计用来处理的。除非您使用TCP/IP over Piges访问数据库,否则我会让数据库执行它设计的功能。如果他们发现数据库速度太慢,我想知道他们是否在表上为查询提供了合适的索引。我希望是这样,但我从我能想到的各个角度都在这样做。即使有索引,每个数据库选项对于任务来说似乎都太慢了(每1000条记录几乎45秒)。我会试试Hashset,看看我们能取得什么样的进展。谢谢当您分析SQL查询的执行计划时,是什么导致了这种计时?这似乎太高了。这是数据的格式。因为我不能直接控制数据结构,或者我需要这个应用程序的特定数据,所以我必须进行4次连接和2次案例陈述,以获得我需要的数据。这并不理想,但这正是我所需要的。这就是为什么我选择提前加载整个列表。