2012-02-15 151 views
5

如何分组枚举值?
假设我有一个枚举像如何分组枚举值?

public enum Colors 
    { 
    LightBlue, 
    LightGreen, 
    DarkGreen, 
    Black, 
    White, 
    LightGry, 
    Yellow 
    } 

现在我想要定义的颜色,例如一些群体浅色(LightBlue,LightGreen,白色,LightGray,黄色)和深色(黑色,DarkGreen)。
所以我可以在我的代码中的不同地方要求团体。
如果我没记错的话,我可以在Java中的枚举中添加方法。我认为这在C#中是不可能的。但也许还有其他方法。

编辑1:当然,我可以添加一个工具类与静态成员像IsADarkColor(Colors c)。但是我想在没有额外班级的情况下做到这一点,因为当我需要该功能时,我可以忘记相关班级。

+1

C#不是Java,写类(在Java中甚至一个枚举是一个对象)。 – 2012-02-15 18:42:00

回答

8

我可以像IsADarkColor(Colors c)静态成员添加一个实用工具类。但是我想在没有额外班级的情况下做到这一点,因为当我需要该功能时,我可以忘记相关班级。

这是当扩展方法派上用场:

// Taking Reed Copsey's naming advice 
public enum Color 
{ 
    LightBlue, 
    LightGreen, 
    DarkGreen, 
    Black, 
    White, 
    LightGray, 
    Yellow 
} 

public static class Colors 
{ 
    public static bool IsLightColor(this Color color) 
    { 
     switch(color){ 
      case Color.LightBlue: 
      case Color.LightGreen: 
      case Color.DarkGreen: 
      case Color.LightGray: 
      return true; 
      default: 
      return false; 
     } 
    } 
} 

只要这两个类都在同一个命名空间,你可以看到静态方法,就好像它属于Color类:

var color = Color.LightBlue; 
if(color.IsLightColor()) {...} 

(帽尖到@Abdul让我想到的扩展方法)

5

你需要在课堂上写这个。

就个人而言,我建议将其重新编制为Color(单数)enum和Colors类。然后Colors类别包括其返回枚举的“群体”的方法或属性(即:IEnumerable<Color> LightColors { get { //...

+0

谢谢。如果没有更好的方法,我将使用该模式作为后备。 – brgerner 2012-02-15 18:47:08

1

有枚举不子分组,但是你可以使用位操作来实现这一目标在一定程度上在某些情况下。 (请参阅this post以获得体面的解释)

我只是坚持使用实用程序类,说实话,它没有什么特别之处,这意味着您可以在网站增长时添加其他描述,下拉操作等。

+0

谢谢。我不喜欢被标记的枚举。我不知道为什么。 – brgerner 2012-02-15 19:03:18

0
在C#

您可以按如下做到这一点(我不太清楚,你真的想要这个与否)

public enum Colors 
    { 
    LightBlue, 
    LightGreen, 
    DarkGreen, 
    Black, 
    White, 
    LightGry, 
    Yellow 
    } 


public enum LightColors{ 
    LightBlue = Colors.LightBlue, 
    LightGreen = Colors.LightGreen, 
    White = Colors.White, 
    LightGray = Colors.LightGray, 
    Yellow = Colors.Yellow 
} 
public enum DarkColors{ 
    Black = Colors.Black, 
    DarkGreen = Colors.DarkGreen 

}

+1

这是一个有趣的技巧,但我不太喜欢创建不同*类型值的想法,它们应该代表相同的基本事物。例如,如果(LightColors.LightBlue == Colors.LightBlue)'产生编译时错误。 – StriplingWarrior 2012-02-15 18:57:58

+0

非常有趣的方式。谢谢! – brgerner 2012-02-15 19:03:46

+0

@StriplingWarrior但你可以通过如下投射来做到这一点,如果((int)LightColors.LightBlue ==(int)Colors.LightBlue) – Abdul 2012-02-15 20:17:17

1

我认为最简单的方法是指定范围内的值。例如:

public enum Color 
{ 
    LightBlue, 
    LightGreen, 
    LightGray, 
    White, 
    Yellow, 
    DarkGreen = 100, 
    Black 
} 

然后,所有高于100的值都应该是暗色。你甚至可以添加一个扩展方法为目的

public bool static IsLightColor(this Color c) 
{ 
    return c < DarkGreen; 
} 

而且使用这样的:

Color c = Color.LightBlue; 
if (c.IsLightColor()) 
{ 
     // do something 
}