根据枚举值获取枚举名称

时间:2011-11-02 11:27:55

标签: c# .net linq c#-4.0 enums

我已声明以下枚举:

public enum AfpRecordId
{
    BRG = 0xD3A8C6,
    ERG = 0xD3A9C6
}

我想从is值中检索枚举对象:

private AfpRecordId GetAfpRecordId(byte[] data)
{
    ...                    
}

致电示例:

byte[] tempData = new byte { 0xD3, 0xA8, 0xC6 };
AfpRecordId tempId = GetAfpRecordId(tempData);

//tempId should be equals to AfpRecordId.BRG

我还想使用linq或lambda,只要它们可以提供更好或相等的性能。

3 个答案:

答案 0 :(得分:9)

简单:

  • 将字节数组转换为int(手动或通过创建四字节数组并使用BitConverter.ToInt32
  • int投向AfpRecordId
  • 如有必要,请在结果上调用ToString(您的主题行建议获取名称,但您的方法签名仅说明该值)

例如:

private static AfpRecordId GetAfpRecordId(byte[] data)
{
    // Alternatively, switch on data.Length and hard-code the conversion
    // for lengths 1, 2, 3, 4 and throw an exception otherwise...
    int value = 0;
    foreach (byte b in data)
    {
        value = (value << 8) | b;
    }
    return (AfpRecordId) value;
}

您可以使用Enum.IsDefined检查给定数据是否实际上是有效 ID。

至于性能 - 在你寻找更快的东西之前,先检查一下简单的东西是否能给你带来足够好的性能。

答案 1 :(得分:1)

如果数组是已知大小(我假设你的例子大小是3)你可以 将元素添加到一起并将结果转换为枚举

private AfpRecordId GetAfpRecordId(byte[] tempData){
    var temp = tempData[0] * 256*256 + tempData[1] * 256 +tempData[2];
    return (AfpRecordId)temp;
}

另一种方法是使用移位运算符

private AfpRecordId GetAfpRecordId(byte[] tempData){
    var temp = (int)tempData[0]<<16 + (int)tempData[1] * 8 +tempData[2];
    return (AfpRecordId)temp;
}

答案 2 :(得分:1)

假设tempData有3个元素使用Enum.GetName (typeof (AfpRecordId), tempData[0] * 256*256 + tempData[1] * 256 +tempData[2])