2012-07-27 35 views
1

我需要在我的数据执行此操作很多次:对于C#4.0中昂贵的Enum.IsDefined(),有什么替代方法?

public void AddBehavior(BehaviorTypes type) 
{ 
    if (Enum.IsDefined(typeof(BehaviorTypes), type)) 
    { 
    switch (type) 
    { 
     case BehaviorTypes.render: 
      return new renderable(); 
     break; 
    } 
} 

也就是两个显式函数调用和对象装箱/拆箱操作!这个操作太昂贵了,只是为了检查一个枚举。有谁知道更便宜的选择?

+0

'BehaviorTypes'是一个枚举,对吧?如果是这样,你可能意指'typeof(BehaviorTypes)'? – 2012-07-27 09:56:45

+0

顺便说一句,IsDefined的实现比代码中的两次调用和装箱花费更多;)它被设计用来支持表示枚举值的字符串或int,所以它的功能相当多! – 2012-07-27 10:27:32

+0

是的,这就是我的意思。我实际上试图摆脱这一点,只是使用BehaviorTypes作为类型,但没有。 – 2012-07-27 11:18:14

回答

2

一个非常标准的诀窍是将成员添加到枚举声明中指定的第一个和最后一个值:

enum BehaviorTypes { 
    First = One,  
    One = 1, 
    Two, 
    Three, 
    Last = Three 
} 

现在,它是一个超高速的测试,时间约一纳秒:

public void AddBehavior(BehaviorTypes type) 
{ 
    if (type >= BehaviorTypes.First && type <= BehaviorTypes.Last) { 
     // etc.. 
    } 
} 

请注意,您的switch语句已经消除了此检查的需要。

+0

两个枚举可以具有相同的值?我今天已经学到了一些东西,谢谢^^如果你有枚举的手,并且在枚举的整数之间没有空格,那么肯定是一个好的解决方案。 – 2012-07-27 12:14:05

+0

是的,在这种情况下,我可以在'default'中找到它并完全取消检查。我打算写这个,并选择它作为正确的答案(因为这正是我正在写的程序中所做的)。但是你的答案肯定更普遍有用。这正是我所期待的。谢谢你们俩。 – 2012-07-28 14:10:15

+0

如果你有枚举{a = 1,c = 3}并且你提交了2呢? – guiomie 2013-06-13 18:22:30

0

您可以在静态成员中一次性提取优化集合中Enum.GetValues的枚举类型的所有现有值。你只需要搜索下一个集合。

如果只考虑一个枚举,我会猜测最快的是一组布尔值,告诉你枚举中是否存在积分。除了这个数组的构造(花费一次)之外,你将有一个enum转换为int,并且在数组中有一个读取访问权限(如果我没有弄错,这是最快的)。

+0

数组上的GetValues是O(1),所以它相当快^^ http://msdn.microsoft.com/en-us/library/2zexc3z9.aspx – 2012-07-27 10:18:13

+0

你可能想要检查GetUpperBound btw。 – 2012-07-27 10:19:50