存储对象列表并将一个属性标识为快速查找的键

时间:2013-03-13 17:59:44

标签: c# list object dictionary key-value

假设我有一个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。

那么,有没有办法存储(某种)对象的列表,并将该对象的一个​​元素标识为键?如果没有,有什么替代品可以做类似的事情,他们有什么权衡?

2 个答案:

答案 0 :(得分:2)

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

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

但是......你真的有记忆问题吗?这是在嵌入式设备上还是内存不足的东西?过早优化(速度和内存)往往是一件坏事。我会考虑你的整体设计并稍后解决内存/性能问题。

答案 1 :(得分:1)

你在谈论的内存数据存储只是......内存。

你要求这样做的“最佳方式”,但不指定任何条件。那么,在内存中存储对象集合的推荐方法就是使用数组或List<>。是的,用LINQ迭代它。 LINQ经过了很好的优化,包括一些运行时优化,你的用例不太可能是这种方法太慢或占用太多内存的。

如果您的数据集确实那么大(在这种情况下内存中似乎是一个糟糕的选择)并且您关注查找时间Dictionary<>将为您提供非常可靠的性能。

但也许您想要的就是对象数据库,考虑db4o。或者文档数据库,考虑RavenDb(或monogo,redis等) - Raven有一个嵌入式模式,允许您在进程中运行它。

同样,对于内存中的东西,这一切都是迂腐的 - 即使是相当大的数据集,我也从未见过只使用内置Dictionary<>是一个问题。