枚举类型在用作词典键时比字符串类型更快/更有效吗?
IDictionary<string,object> or IDictionary<enum,object>
事实上,哪种数据类型最适合作为字典键?为什么?
请考虑以下事项:注意:为简单起见,只有5个属性
struct MyKeys
{
public string Incomplete = "IN";
public string Submitted = "SU";
public string Processing="PR";
public string Completed = "CO";
public string Closed = "CL";
}
和
enum MyKeys
{
Incomplete,
Submitted,
Processing,
Completed,
Closed
}
如果在词典中用作键,上述哪一项会更好!
答案 0 :(得分:14)
当然enum
版本更好(当两者都适用且当然有意义时)。不仅仅是性能(可能更好或更糟,请参阅Rashack非常好的评论),因为它检查了编译时间并使代码更清晰。
您可以使用Dictionary<int, object>
并将enum
密钥转换为int
或指定自定义比较器来规避比较器问题。
答案 1 :(得分:5)
我认为你应该首先关注正确性。这比程序中可能出现的次要性能差异之间的最小差异重要得多。在这种情况下,我将专注于您的类型的正确表示(枚举似乎是最好的)。然后稍后对您的应用程序进行概要分析,如果出现问题,那么只有这样才能修复它。
在此过程中稍后加快代码通常是一个简单的过程。获取skolima提供的链接。如果您选择了枚举,那么在应用程序中删除潜在性能问题大概需要10分钟。我想在这里强调潜力这个词。对于NHibernate来说这肯定是一个问题,但是对于你的程序来说它是否会成为问题将完全取决于用途。
另一方面,在过程的后期使代码更正确往往更加困难。在足够大的问题中,您会发现人们开始依赖先前不良行为的副作用。这可以在不破坏其他组件的情况下纠正代码。
答案 2 :(得分:2)
使用枚举来获得更清晰,更好的代码,但如果您关注性能,请记得提供自定义比较器:http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx。
答案 3 :(得分:1)
答案 4 :(得分:-1)
我猜想枚举版本更快。在引擎盖下,字典通过哈希码引用所有内容。我的猜测是,为字符串生成哈希码的速度较慢。然而,这可能是可以忽略的慢,并且肯定比字符串比较更快。我同意其他海报的说法,他们认为枚举更清洁。