对于字典来说太大了,当使用IEnumerable.ToDictionary()时
本文关键字:IEnumerable ToDictionary 于字典 字典 大了 | 更新日期: 2023-09-27 18:36:19
假设,在我的方法中,我传入了几个IEnumerable(可能是因为我将从数据库或其他东西中获取一堆对象)。
然后对于对象 1 中的每个对象,我想从具有相同 object.iD 的对象 2 中提取一个差异对象。
我不想要多个枚举(根据 resharper 的说法),所以我可以将 objects2 制作成一个用 object.iD 键的字典。然后我只为每个枚举一次。(次要问题)这是一个好的模式吗?
(主要问题)什么太大了?在什么时候,这将是一个可怕的模式?多少个对象对于字典来说太多的对象?
在内部,它将阻止拥有超过 20 亿个项目。由于事物在字典中的定位方式相当复杂,如果我正在考虑处理十亿个项目(例如,如果是 16 位值,那么是 2GB),我会希望将它们存储在数据库中并使用数据访问代码检索它们。
不过,我不得不问,对象 1 和对象 2 从何而来? 听起来好像你可以在数据库级别做到这一点,它会比在 C# 中这样做要高效得多!
您可能还需要考虑使用 KeyValuePair[]
字典存储KeyValuePair的实例
如果您只想在字典中查找给定其Key
的值,那么是的,字典是要走的路 - 他们很快就能做到这一点。但是,如果要使用Value
或其属性对项目进行排序或搜索它们,则最好使用其他内容。
就大小而言,它们会随着变大而变慢,值得做一些基准测试以了解它如何影响您的需求,但您始终可以根据它们的类型或范围在多个字典中拆分值。 http://www.dotnetperls.com/dictionary-size
值得注意的是,当你说"那么我只为每个人枚举一次"时,这有点不正确。 objects1
将被完全枚举,但不会枚举objects2
字典。只要您使用Key
检索值,它就会对键进行哈希处理并使用结果来计算存储值的位置,因此字典可以很快获得您请求的值。理想情况下,对Key
使用 int,因为它可以直接将其用作哈希。您可以枚举它们,但最好使用 objects2Dictionary[key]
查找对象。