在数组中存储枚举VS存储在字典中?

时间:2012-11-17 10:40:04

标签: 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选项更快吗?好吧,我可以测试一下......但是现在当我写完这个问题时,我想知道别人的想法。

2 个答案:

答案 0 :(得分:4)

Dictionany<TKey, TValue>不是“智能”,并且不会针对任何给定的密钥进行优化。强调实施总是一样的。

但是,关于性能,使用enum值作为字典中的键比您预期的要慢得多,并且比将Int32作为键存储慢得多。这是因为运行时使用重度反射来调用GetHashCode()时枚举的哈希码。如果真的发现这很奇怪。

但是,当最可读的方法(使用枚举作为字典中的键)足够快时,所有这些都无关紧要。这里没有人可以为你回答这个问题。你必须衡量这一点。不要进行过早优化,并使用最易读/可维护的代码,直到证明解决方案在您的情况下不够快(可能是这样)。

但是,不要切换到数组,而是尝试使用Int32键切换到字典:

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

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

答案 1 :(得分:1)

这是一个主观的答案,但我个人会在字典中使用数组:

  1. 所有枚举成员的基础值都是连续的。如果值之间存在较大间隙,则使用数组会不直观(并浪费内存),例如:

    enum MyEnum { Units, Tens = 10, Hundreds = 100, }

  2. 所有枚举成员在结构中始终都有一个值。如果他们不这样做,那么字典将提供更直观的语义,以通过其TryGetValue方法检查特定密钥的存在。 (也就是说,如果值是引用类型,您也可以使用null表示缺席。)