假设我有一些枚举。例如
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
选项更快吗?好吧,我可以测试一下......但是现在当我写完这个问题时,我想知道别人的想法。
答案 0 :(得分:4)
Dictionany<TKey, TValue>
不是“智能”,并且不会针对任何给定的密钥进行优化。强调实施总是一样的。
但是,关于性能,使用enum
值作为字典中的键比您预期的要慢得多,并且比将Int32
作为键存储慢得多。这是因为运行时使用重度反射来调用GetHashCode()
时枚举的哈希码。如果真的发现这很奇怪。
但是,当最可读的方法(使用枚举作为字典中的键)足够快时,所有这些都无关紧要。这里没有人可以为你回答这个问题。你必须衡量这一点。不要进行过早优化,并使用最易读/可维护的代码,直到证明解决方案在您的情况下不够快(可能是这样)。
但是,不要切换到数组,而是尝试使用Int32
键切换到字典:
var dictionary = new Dictionary<int, /*someStructure*/>();
dictionary[(int)MyEnum.Item1] = /*new someStructure()*/;
答案 1 :(得分:1)
这是一个主观的答案,但我个人会在字典中使用数组:
所有枚举成员的基础值都是连续的。如果值之间存在较大间隙,则使用数组会不直观(并浪费内存),例如:
enum MyEnum
{
Units,
Tens = 10,
Hundreds = 100,
}
所有枚举成员在结构中始终都有一个值。如果他们不这样做,那么字典将提供更直观的语义,以通过其TryGetValue
方法检查特定密钥的存在。 (也就是说,如果值是引用类型,您也可以使用null
表示缺席。)