3

假设我有一些枚举。例如

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选择更快吗?好吧,也许我可以测试一下……但是现在当我写下这个问题时,我想知道其他人的想法。

4

2 回答 2

4

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

但是,关于性能,enum在字典中使用值作为键比您预期的要慢得多,并且比作为键存储要慢Int32得多。原因是运行时在调用GetHashCode(). 如果实际上发现这很奇怪。

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

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

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

dictionary[(int)MyEnum.Item1] = /*new someStructure()*/;
于 2012-11-17T10:52:06.750 回答
1

这是一个主观的答案,但在以下情况下,我个人会在字典上使用数组:

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

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

  2. All enumeration members will always have a value in the structure. If they don't, then the dictionary would provide more intuitive semantics for checking for the presence of a particular key through its TryGetValue method. (That said, you could alternatively use null to indicate absence if the values are a reference type.)

于 2012-11-17T10:53:29.803 回答