在C#中使用Dictionary的正确方法是什么?

时间:2012-04-28 15:20:05

标签: c# performance object coding-style dictionary

我有(很多)对象Foo,其中包含唯一的ID,并希望将这些对象存储在Dictionary中。 C#中的字典键可以是任何原始类型或对象。我可以使用整数foo1.ID作为键,但也可以使用对象foo1

使用ID(整数)或对象作为键是否有正确的实现方法?

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

5 个答案:

答案 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 - 如果您已经拥有该对象,那么查找它也没有意义。