繁体   English   中英

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

[英]Storing a list of objects and identifying one property as a Key for fast lookup

可以说我有一个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。

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

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

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

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

您正在谈论的只是一个内存中的内存数据存储。

您要求这样做的“最佳方法”,但不指定任何条件。 好吧,建议在内存中存储对象集合的方法只是使用数组或List<> 是的,使用LINQ遍历它。 LINQ进行了非常好的优化,包括一些运行时优化,您的用例不太可能是这种方法太慢或使用太多内存的用例。

如果您的数据集确实很大(在这种情况下,内存中似乎是一个糟糕的选择),并且您担心查找时间, Dictionary<>将为您提供相当不错的性能。

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

再次,对于内存中的东西来说,这都是花哨的-即使是对于相当大的数据集,我也从未见过仅使用内置的Dictionary<>会遇到问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM