0

假设我有一个 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<>,但是我必须要么 foreach 并查看,要么使用 LINQ。

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

4

2 回答 2

2

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

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

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

于 2013-03-13T18:07:26.567 回答
1

您说的是内存中的数据存储,它只是...内存。

您要求执行此操作的“最佳方式”,但未指定任何条件。好吧,在内存中存储对象集合的推荐方法是使用数组或List<>. 是的,使用 LINQ 遍历它。LINQ 得到了很好的优化,包括一些运行时优化,您的用例不太可能是这种方法太慢或使用太多内存的用例。

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

但也许您想要的实际上是对象数据库之类的东西,请考虑db4o。或文档数据库,考虑RavenDb(或 monogo、redis 等) - Raven 具有嵌入式模式,允许您在进程中运行它。

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

于 2013-03-13T18:07:45.983 回答