存储对象列表并将一个属性标识为Key以便快速查找
本文关键字:Key 标识 查找 属性 一个 列表 对象 存储 | 更新日期: 2023-09-27 18:03:57
假设我有一个storyCharacter对象列表。每个对象存储一个ID#、名称和最喜欢的颜色,例如下面的示例:
ID# | Name | Favorite Color
21 | Optimus | Blue
29 | Ironhide | Red
34 | Starscream | White
创建键值对的最佳方法是什么?
我知道我可以使用字典,但是我会
dictionary.Add(storyCharacter1.IDnum, storyCharacter1);
是一个好方法吗?我认为这种方法将复制ID作为键,因此不必要地使用更多内存,因为该信息已经在对象中了。当然,我可以不将IDnum存储在storyCharacter对象中,而只使用它作为键。因为这将创建一个只有名称和颜色的对象,然后与IDnum的键相关联,这感觉就像我解耦了应该保持在一起的数据。
我也可以使用List<>,但这样我就必须要么遍历并遍历,要么使用LINQ。
那么,是否有一种方法可以存储一个对象列表,并将该对象的一个元素标识为键?如果没有,有什么替代方案可以做类似的事情,它们的权衡是什么?
创建这样的字典是一种常见且完全有效的加快查找速度的方法。使用更多内存来获得更高的性能是一种常见的权衡。
如果IDNum是double
(我怀疑),字典最多将使用每个键8个字节,除此之外,它将使用每个键4个字节。如果IDNum是一个对象,它不会复制整个对象,只是对它的引用(在32位系统上占用4个字节)。
但是…你真的有记忆问题吗?这是嵌入式设备还是内存较低的设备?过早的优化(对于速度和内存)通常是一件坏事。我同意你的总体设计,以后再解决内存/性能问题。
你说的是内存中的数据存储,它只是…内存。
你询问做这件事的"最佳方法",但没有指定任何条件。在内存中存储对象集合的推荐方法是使用一个数组或List<>
。是的,用LINQ对它进行迭代。LINQ经过了很好的优化,包括一些运行时优化,你的用例不太可能是这种方法太慢或使用太多内存。
如果你的数据集确实那么大(在这种情况下内存似乎是一个糟糕的选择),并且你关心查找时间Dictionary<>
将给你相当稳定的性能。
但是,也许您真正想要的是类似对象数据库的东西,可以考虑db40。或者一个文档数据库,考虑RavenDb(或monogo,redis等)——Raven有一个嵌入式模式,允许你在进程中运行它。
再次,对于内存中的东西,这都是迂腐的-即使是相当大的数据集,我从来没有见过仅仅使用内置的Dictionary<>
是一个问题。