比较枚举和整数

时间:2018-07-31 08:13:29

标签: c# enums

请参阅以下枚举

public enum Fruit
{
 Apple = 1,
 Orange = 2,
 Banana= 3
}

public enum Color
{
 Orange = 1,
 Yellow = 2,
 Red= 3
}

现在我想用Color映射Fruit,所以我实现了

public enum FruitColor
{
 1= 3,
 2= 1,
 3= 2
}

实现FruitColor时出现语法错误

  

期望的标识符

如何解决这个问题?

5 个答案:

答案 0 :(得分:5)

使用enum映射枚举值没有意义。我会用字典:

Dictionary<Fruit, Color> FruitToColor = new Dictionary<Fruit, Color>
                                          { { Fruit.Apple, Color.Red }
                                          , { Fruit.Orange, Color.Orange }
                                          , { Fruit.Banana, Color.Yellow }
                                          };

Color colorOfBanana = FruitToColor[Fruit.Banana]; // yields Color.Yellow

答案 1 :(得分:2)

也可以把它放在那里,因为我可以,唯一的好处是您可以在自定义属性中编码其他数据。但是id与字典或开关一起使用;)

给出

public enum MyFruit
{
    [MyFunky(MyColor.Orange)]
    Apple = 1,
    [MyFunky(MyColor.Yellow)]
    Orange = 2,
    [MyFunky(MyColor.Red)]
    Banana = 3
}

public enum MyColor
{
    Orange = 1,
    Yellow = 2,
    Red = 3
}

public static class MyExteions
{
    public static MyColor GetColor(this MyFruit fruit)
    {
        var type = fruit.GetType();
        var memInfo = type.GetMember(fruit.ToString());
        var attributes = memInfo[0].GetCustomAttributes(typeof (MyFunkyAttribute), false);
        if (attributes.Length > 0)
            return ((MyFunkyAttribute)attributes[0]).Color;
        throw new InvalidOperationException("blah");
    }
}

public class MyFunkyAttribute : Attribute
{
    public MyFunkyAttribute(MyColor color) { Color = color;}   
    public MyColor Color { get; protected set; }
}

用法

var someFruit = MyFruit.Apple;
var itsColor = someFruit.GetColor();
Console.WriteLine("Fruit = " + someFruit + ", Color = " + itsColor);

输出

Fruit = Apple, Color = Orange

Full Demo Here

答案 2 :(得分:0)

成员标识符不允许以数字开头,但是您可以使用一种方法从每个enum中获取正确的值:

public Fruit GetFruit(this Color c) {
    switch ((int)c) {
        case 1: return (Fruit)3;
        case 2: return (Fruit)2;
        case 3: return (Fruit)1;
    }
    return 0;
}

此方法的相反操作将为您提供Color中的Fruit。您可以通过Color类型将此方法作为静态方法来调用:

Fruit myFruit = Color.GetFruit(Color.Orange);

答案 3 :(得分:0)

您不能将数字用作枚举键。您可以使用字典来映射值:

var map =  new Dictionary<Fruit, Color> 
           {
              { Fruit.Apple, Color.Red },
              { Fruit.Orange, Color.Orange },
              { Fruit.Banana, Color.Yellow }
           };

要访问映射值,请使用:

var mappedValue = map[Fruit.Apple];

或者,因为要映射反值(1到3和3到1),所以可以使用整数的强制类型转换,尽管这样做很危险,因为结果可能不确定。

var src = (int) Fruit.Apple; // src = 1;
var tar = 4 - src; // tar = 3;
var mapped = (Color) tar;   

更多通用示例:

function Color Map(Fruit fruit) 
{
   var src = (int) fruit;
   var tar = 4 - src;
   var color = (Color) tar;   
   return color;
}

答案 4 :(得分:-1)

枚举用于枚举目的。也就是说,如果您希望某些数据具有固定的串行顺序,则应使用Enum。它不是用于映射的目的。

请按照建议使用Dictionary或在Java中,您可以使用MAP实现,将枚举之一作为键,将其他枚举作为值,如下所示:-

映射fruitColorMap = new HashMap <>();

map.add(苹果,红色);