我有(很多)Foo
具有唯一性的对象,ID
并希望将它们存储在Dictionary
. C# 中的字典键可以是任何基本类型或对象。我可以使用整数foo1.ID
作为键,也可以使用对象foo1
。
哪种是实现它的正确方法,使用ID
(整数)或对象作为键在性能上是否存在差异?
注意。字典中的值是对象的其他(类型)。
我有(很多)Foo
具有唯一性的对象,ID
并希望将它们存储在Dictionary
. C# 中的字典键可以是任何基本类型或对象。我可以使用整数foo1.ID
作为键,也可以使用对象foo1
。
哪种是实现它的正确方法,使用ID
(整数)或对象作为键在性能上是否存在差异?
注意。字典中的值是对象的其他(类型)。
这取决于您的用例。假设您想查找给定键值的对象,您当然希望 id 成为键。你问这个问题让我想也许你根本不需要字典 - 如果你只需要保留一组项目,请使用 aList<T>
代替 - 字典用于将键(例如 id)映射到值(例如自定义对象)。
你打算如何搜索字典?如果您打算完全基于 搜索字典中的项目ID
,则使用它作为键。OTOH,如果您要拥有 a 的实例Foo
,则将其设为关键。
回复:您的编辑 - 现在我们知道这Foo
是“键”或“通过访问属性提供键值的对象”,那么说起来似乎很简单,使用Dictionary<Foo,OtherClass>
- 假设您已经设置了相等比较Foo
适当的对象 - 为什么要强制每个查找实例知道从对象中提取特定属性Foo
?
无论您使用什么作为密钥,都必须能够进行比较。对于原始类型,相等性通常按照您的预期定义。对于对象,您将测试引用相等性,除非您定义了另一种比较对象的方法,您可以通过IComparer
在Dictionary
构造函数中传递适当的类型来做到这一点。
但是,在您的情况下,键入int
可能是最简单的。将对象用作自己的密钥并没有真正的好处。您可以简单地通过获取Foo
对象集合并执行以下操作来创建字典:
IDictionary<int, Foo> fooDictionary = fooCollection.ToDictionary(f => f.ID);
在大多数情况下,搜索字典比每次都简单地搜索给定 ID 的集合更有效。
字典是Key Value Pairs
. 每个键都应该是唯一的。编译器必须确保密钥是唯一的。通过将密钥作为对象而不是整数提供,您可能会做的太过分了。编译器通过比较来检查 Key 中的整个对象,以确保它是唯一的。因此,如果可以帮助您唯一地识别您的记录,我会选择 Integer Key。
使用 ID - 如果您已经拥有该对象,那么查找它也没有任何意义。