假设我有一个storyCharacter对象列表。每个对象都存储一个ID#,名称和喜欢的颜色,如下例所示:
ID# | Name | Favorite Color
21 | Optimus | Blue
29 | Ironhide | Red
34 | Starscream | White
创建键值对的最佳方法是将其键入ID#。
我知道我可以使用字典,但
dictionary.Add(storyCharacter1.IDnum, storyCharacter1);
这是一个很好的方法吗?我假设这种方式会将ID的副本作为密钥,因此不必要地占用更多内存,因为该信息已经存在于对象中。当然,我不能将IDnum存储在storyCharacter对象中,只需将其用作键即可。因为这会创建一个只有名称和颜色的对象,然后与IDnum的一个关键字相关联,这就像我正在解耦应该保持在一起的数据。
我也可以使用List<>,但是我必须要预先查看,或者使用LINQ。
那么,有没有办法存储(某种)对象的列表,并将该对象的一个元素标识为键?如果没有,有什么替代品可以做类似的事情,他们有什么权衡?
答案 0 :(得分:2)
创建这样的字典是加快查找内容的常用且完全有效的方法。使用更多内存来获得更高性能是一种常见的权衡。
如果IDNum是double
(我怀疑),那么字典最多只能使用每个密钥8个字节,除此之外每个密钥使用4个字节。如果IDNum是一个对象,它不会复制整个对象只是对它的引用(在32位系统上占用4个字节)。
但是......你真的有记忆问题吗?这是在嵌入式设备上还是内存不足的东西?过早优化(速度和内存)往往是一件坏事。我会考虑你的整体设计并稍后解决内存/性能问题。
答案 1 :(得分:1)
你在谈论的内存数据存储只是......内存。
你要求这样做的“最佳方式”,但不指定任何条件。那么,在内存中存储对象集合的推荐方法就是使用数组或List<>
。是的,用LINQ迭代它。 LINQ经过了很好的优化,包括一些运行时优化,你的用例不太可能是这种方法太慢或占用太多内存的。
如果您的数据集确实那么大(在这种情况下内存中似乎是一个糟糕的选择)并且您关注查找时间Dictionary<>
将为您提供非常可靠的性能。
但也许您想要的就是对象数据库,考虑db4o。或者文档数据库,考虑RavenDb(或monogo,redis等) - Raven有一个嵌入式模式,允许您在进程中运行它。
同样,对于内存中的东西,这一切都是迂腐的 - 即使是相当大的数据集,我也从未见过只使用内置Dictionary<>
是一个问题。