2011-11-02 182 views
6

我已经宣布下列枚举枚举名称:获取基于枚举值

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

,我要检索的枚举对象从是值:

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,只要它们能够提供更好或相等的性能。

+0

可能重复的[获取枚举名称,当值已知](http://stackoverflow.com/questions/3327883/get-enum-name-when-value-is-known) – Heinzi

回答

9

简单:

  • 字节数组转换为int(手动,或者通过创建一个四个字节数组,并使用BitConverter.ToInt32
  • intAfpRecordId
  • 呼叫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。

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

+0

我被迫转换字节数组为int?如果我把它正确的值“BRG = 0xD3A8C6”不被识别为一个字节[]? –

+0

我不认为他实际上是在寻找一个字符串(我以为最初也是这样)如果你看他的锅炉板方法的返回类型,它会返回枚举值 –

+3

@Duncan_McCloud:的确,“0xd3a8c6”是一个'int'文字,不是字节数组。虽然除了将字节数组转换为整型数据之外,还有其他方法,但它们会有效地归结为类似的东西,并且会变得更加复杂。这段代码应该非常快,而且很好,很简单 - 你不喜欢这个吗? –

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

请注意,这里假设'tempData'包含三个元素。这*可能是一个有效的假设,但它可能不是。 –

+0

这是一个有效的假设:) –

+0

@JonSkeet是的,它确实假设(基于示例代码,我已更新,以便答案突出了假设。 –

1

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