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