1

次のオブジェクトがあります:

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[] { '^', '/', '*', '*', '-', '*' };

前もって感謝します。

4

2 に答える 2

5

配列の要素は、列挙定数のバイナリ値(つまり、符号なしの大きさ)で並べ替えられます。

ソース: http: //msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx

于 2012-10-07T11:57:02.770 に答える
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;
    }
}
于 2012-10-07T12:07:03.720 に答える