1

我有(很多)Foo具有唯一性的对象,ID并希望将它们存储在Dictionary. C# 中的字典键可以是任何基本类型或对象。我可以使用整数foo1.ID作为键,也可以使用对象foo1

哪种是实现它的正确方法,使用ID(整数)或对象作为键在性能上是否存在差异?

注意。字典中的值是对象的其他(类型)。

4

5 回答 5

2

这取决于您的用例。假设您想查找给定键值的对象,您当然希望 id 成为键。你问这个问题让我想也许你根本不需要字典 - 如果你只需要保留一组项目,请使用 aList<T>代替 - 字典用于将键(例如 id)映射到值(例如自定义对象)。

于 2012-04-28T15:22:36.737 回答
2

你打算如何搜索字典?如果您打算完全基于 搜索字典中的项目ID,则使用它作为键。OTOH,如果您要拥有 a 的实例Foo,则将其设为关键。


回复:您的编辑 - 现在我们知道这Foo是“键”或“通过访问属性提供键值的对象”,那么说起来似乎很简单,使用Dictionary<Foo,OtherClass>- 假设您已经设置了相等比较Foo适当的对象 - 为什么要强制每个查找实例知道从对象中提取特定属性Foo

于 2012-04-28T15:24:05.163 回答
1

无论您使用什么作为密钥,都必须能够进行比较。对于原始类型,相等性通常按照您的预期定义。对于对象,您将测试引用相等性,除非您定义了另一种比较对象的方法,您可以通过IComparerDictionary构造函数中传递适当的类型来做到这一点。

但是,在您的情况下,键入int可能是最简单的。将对象用作自己的密钥并没有真正的好处。您可以简单地通过获取Foo对象集合并执行以下操作来创建字典:

IDictionary<int, Foo> fooDictionary = fooCollection.ToDictionary(f => f.ID);

在大多数情况下,搜索字典比每次都简单地搜索给定 ID 的集合更有效。

于 2012-04-28T15:27:15.550 回答
1

字典是Key Value Pairs. 每个键都应该是唯一的。编译器必须确保密钥是唯一的。通过将密钥作为对象而不是整数提供,您可能会做的太过分了。编译器通过比较来检查 Key 中的整个对象,以确保它是唯一的。因此,如果可以帮助您唯一地识别您的记录,我会选择 Integer Key。

于 2012-04-28T15:30:11.900 回答
0

使用 ID - 如果您已经拥有该对象,那么查找它也没有任何意义。

于 2012-04-28T15:23:11.797 回答