c# - 将枚举存储在数组中 VS 存储在字典中?

标签 c#

假设我有一些枚举。例如

enum MyEnum
{ 
    Item1, 
    Item2, 
    Item3
}

我想为枚举中的每个项目“缓存”一些东西。所以我有两个选择。

字典选项:

Dictionary<MyEnum, /*someStructure*/> cache = new Dictionary<MyEnum, /*someStructure*/>>();

或数组选项:

/*someStructure*/[] cache = new /*someStructure*/[Enum.GetValues(typeof(MyEnum)).Length]

每个选项的优缺点是什么?在我看来Dictionary选项更具可读性和易用性,但比 Array 慢选项。

但会Dictionary实际上会更慢?大概 Dictionary是“聪明”到足以理解当enum用作键,那么仅“数组”就可以用作底层实现?

所以问题是 - “丑陋的 array 选项”会比“简单的”Dictionary 更快吗?选项?好吧,也许我可以测试一下……但现在当我写完问题后,我想知道其他人的想法。

最佳答案

Dictionany<TKey, TValue>不是“智能”并且不会针对任何给定的键进行优化。底层实现始终相同。

但是,关于性能,使用enum values as key in dictionary 比您预期的要慢得多,并且比存储 Int32 慢得多作为关键。这是因为运行时在调用 GetHashCode() 时使用大量反射来获取枚举的哈希码。 .如果实际上发现这很奇怪。

但是当最具可读性的方法(使用枚举作为字典中的键)足够快时,所有这些都无关紧要。这里没有人可以为您回答这个问题。你必须测量这个。不要过早地进行优化并使用最易读/可维护的代码,直到证明该解决方案对于您的情况而言不够快(它可能会如此)。

但是,不要切换到数组,而是尝试切换到带有 Int32 的字典。键:

var dictionary = new Dictionary<int,  /*someStructure*/>();

dictionary[(int)MyEnum.Item1] = /*new someStructure()*/;

关于c# - 将枚举存储在数组中 VS 存储在字典中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13429779/

相关文章:

c# - EntityFramework 同表多对多关系

C# WebBrowser 控件 - 使用 InvokeMember ("Click"提交表单不工作)

c# - 错误 : No value given for one or more required parameters

c# - 将字典转换为 C# 中的对象列表

c# - 两个 .Net 应用程序之间的高效通信

c# - 具有相似元素的 Selenium Webdriver C# 页面

c# - 实例类的静态成员

c# - 如何在 JSON 中为空 DataTable 包含列元数据

c# - Xamarin 媒体插件获取 android 图像路径

c# - foreach 特定列中的标签,C#