根据枚举值获取枚举名称

Dun*_*oud 6 .net c# linq enums c#-4.0

我已声明以下枚举:

public enum AfpRecordId
{
    BRG = 0xD3A8C6,
    ERG = 0xD3A9C6
}
Run Code Online (Sandbox Code Playgroud)

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

private AfpRecordId GetAfpRecordId(byte[] data)
{
    ...                    
}
Run Code Online (Sandbox Code Playgroud)

调用示例:

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

//tempId should be equals to AfpRecordId.BRG
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Duncan_McCloud:的确,`0xd3a8c6`是一个`int`文字,而不是一个字节数组.虽然除了将字节数组转换为int之外可能还有其他方法,但它们有效地归结为类似的东西,并且更复杂.这段代码应该非常快,而且很简单 - 你不喜欢什么? (3认同)