存储对象列表并将一个属性标识为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。

那么,是否有一种方法可以存储一个对象列表,并将该对象的一个元素标识为键?如果没有,有什么替代方案可以做类似的事情,它们的权衡是什么?

存储对象列表并将一个属性标识为Key以便快速查找

创建这样的字典是一种常见且完全有效的加快查找速度的方法。使用更多内存来获得更高的性能是一种常见的权衡。

如果IDNum是double(我怀疑),字典最多将使用每个键8个字节,除此之外,它将使用每个键4个字节。如果IDNum是一个对象,它不会复制整个对象,只是对它的引用(在32位系统上占用4个字节)。

但是…你真的有记忆问题吗?这是嵌入式设备还是内存较低的设备?过早的优化(对于速度和内存)通常是一件坏事。我同意你的总体设计,以后再解决内存/性能问题。

你说的是内存中的数据存储,它只是…内存。

你询问做这件事的"最佳方法",但没有指定任何条件。在内存中存储对象集合的推荐方法是使用一个数组或List<>。是的,用LINQ对它进行迭代。LINQ经过了很好的优化,包括一些运行时优化,你的用例不太可能是这种方法太慢或使用太多内存。

如果你的数据集确实那么大(在这种情况下内存似乎是一个糟糕的选择),并且你关心查找时间Dictionary<>将给你相当稳定的性能。

但是,也许您真正想要的是类似对象数据库的东西,可以考虑db40。或者一个文档数据库,考虑RavenDb(或monogo,redis等)——Raven有一个嵌入式模式,允许你在进程中运行它。

再次,对于内存中的东西,这都是迂腐的-即使是相当大的数据集,我从来没有见过仅仅使用内置的Dictionary<>是一个问题。