请参阅以下枚举
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时出现语法错误
期望的标识符
如何解决这个问题?
答案 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
答案 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(苹果,红色);