2012-10-07 53 views
1

我的下一個對象:C#枚舉忽略的名字爲了

private enum Operation 
{ 
     Power = 0x5E,    //^
     Division = 0x2F,   ///
     Multiplication = 0x2A, // * 
     Subtraction = 0x2D,  // - 
     Addition = 0x2B   // + 
} 

當我想要把它轉換成一個char[]在接下來的方式:

private static char[] GetOperators() 
{ 
     List<char> ExistingOperators = new List<char>(); 

     foreach (Operation enumOperator in Enum.GetValues(typeof(Operation))) 
     { 
       ExistingOperators.Add((char)enumOperator); 
       Console.WriteLine(enumOperator); 
     } 

     return ExistingOperators.ToArray<char>(); 
} 

它寫在控制檯上的值的枚舉,但在排序從小到大。 上面的例子輸出:

Multiplication 
Addition 
Subtraction 
Divison 
Power 

我想達到什麼:(以使陣列中相同的順序作爲enum聲明)

char[] { '^', '/', '*', '*', '-', '*' }; 

預先感謝。

+0

使用某種具有的IComparer排序列表:http://msdn.microsoft.com/en-us/library/e7a8xew6.aspx –

+0

順序是枚舉存儲的是它的值,你可以有什麼是按名稱排序它們(只是使用.OrderBy(x => Enum.GetName(typeof(Operation),x))。聲明的順序根本不保存。你可以這樣做(如果你真的需要它的話)就是應用一些自定義屬性,並將它用於排序(如DisplayOrderAttribute) –

+0

更好的解決方案(用於未來擴展和實際問題米)是**不要使用枚舉**。使用私有構造函數和許多常量字段(加法,乘法...)創建基類操作。聲明順序被保留(**很弱** !!!),你會得到其他好處。 –

回答

2

你可以使用這些方針的東西來維持秩序和價值相關聯。請注意,代碼是徒手畫(未經測試)。

public ValueAttribute : Attribute 
{ 
    public char Value { get; set; } 
    public ValueAttribute(char value) { Value = value; } 
} 

private enum Operation 
{ 
    [Value(0x5E)] 
    Power = 1, 
    [Value(0x2F)] 
    Division = 2, 
    [Value(0x2A)] 
    Multiplication = 3, 
    [Value(0x2D)] 
    Subtraction = 4, 
    [Value(0x2B)] 
    Addition = 5, 
} 

private static char[] GetOperators() 
{ 
    List<char> ExistingOperators = new List<char>(); 

    foreach (Operation enumOperator in Enum.GetValues(typeof(Operation))) 
    { 
      ExistingOperators.Add(enumOperator.Value()); 
      Console.WriteLine(enumOperator); 
    } 

    return ExistingOperators.ToArray<char>(); 
} 

public static class Extensions 
{ 
    public static char Value(this Operation op) 
    { 
     var attr = typeof(Operation) 
      .GetField(op.ToString()) 
      .GetCustomAttributes(typeof(ValueAttribute), false)[0] 
      as ValueAttribute; 
     return attr.Value; 
    } 
} 

交替使用IndexAttribute:

public IndexAttribute : Attribute 
{ 
    public int Index { get; set; } 
    public IndexAttribute(int index) { Index = index; } 
} 

private enum Operation 
{ 
    [Index(1)] 
    Power = 0x5E, 
    [Index(2)] 
    Division = 0x2F, 
    [Index(3)] 
    Multiplication = 0x2A, 
    [Index(4)] 
    Subtraction = 0x2D, 
    [Index(5)] 
    Addition = 0x2B, 
} 

public struct Datum 
{ 
    int Index { get; set; } 
    char Value { get; set; } 
    Operation Op { get; set; } 
} 
private static char[] GetOperators() 
{ 
    IEnumerable<Datum> data = new List<Datum>(); 

    foreach (Operation enumOperator in Enum.GetValues(typeof(Operation))) 
    { 
     data.Add(new Datum 
     { 
      Index = enumOperator.Index(), 
      Value = (char)enumOperator, 
      Op = enumOperator 
     }); 
    } 

    // assuming you can use LINQ 
    data = data.OrderBy(d => d.Index); 
    data.Foreach(d => Console.WriteLine(d => d.Op)); 

    return data.Select(d => d.Value).ToArray(); 
} 

public static class Extensions 
{ 
    public static char Index(this Operation op) 
    { 
     var attr = typeof(Operation) 
      .GetField(op.ToString()) 
      .GetCustomAttributes(typeof(IndexAttribute), false)[0] 
      as IndexAttribute; 
     return attr.Index; 
    } 
} 
+0

PositionAttribute可能會更好,存儲有序信息,同時將枚舉值保留在應有的位置。 – sisve

+0

@SimonSvensson。當然。這只是一個例子。 OrdinalAttribute/IndexAttribute/PositionAttribute可以實現相同的目標。 –