在 C# 中使用字典的正确方法是什么

本文关键字:方法 是什么 字典 | 更新日期: 2023-09-27 18:32:38

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

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

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

在 C# 中使用字典的正确方法是什么

你打算如何搜索字典?如果您打算纯粹基于 ID 在字典中搜索项目,则使用它作为键。OTOH,如果你要有一个Foo的实例,那么把它作为密钥。


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

这取决于

您的用例。假设你想在给定对象的键值的情况下查找对象,你当然希望 id 是键。你问这个问题让我觉得也许你根本不想要字典 - 如果你只需要保留项目集合,请使用List<T>代替 - 字典用于将键(例如 id)映射到值(例如自定义对象)。

无论您使用什么作为键,都必须能够进行比较。 对于基元类型,相等性通常按预期定义。 对于对象,您将测试引用相等性,除非您定义了另一种方法来比较对象,这可以通过在 Dictionary 构造函数中传递适当类型的IComparer来实现。

但是,在您的情况下,键入int可能是最简单的。 使用对象作为其自己的键不会获得任何真正的好处。 您只需获取Foo对象的集合并执行以下操作来创建字典:

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

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

字典

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

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