获取基于枚举值
我已经宣布下列枚举枚举名称:获取基于枚举值
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,只要它们能够提供更好或相等的性能。
简单:
- 字节数组转换为
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。
至于性能 - 在你寻找更快的东西之前,检查一下简单的东西是否足够好。
我被迫转换字节数组为int?如果我把它正确的值“BRG = 0xD3A8C6”不被识别为一个字节[]? –
我不认为他实际上是在寻找一个字符串(我以为最初也是这样)如果你看他的锅炉板方法的返回类型,它会返回枚举值 –
@Duncan_McCloud:的确,“0xd3a8c6”是一个'int'文字,不是字节数组。虽然除了将字节数组转换为整型数据之外,还有其他方法,但它们会有效地归结为类似的东西,并且会变得更加复杂。这段代码应该非常快,而且很好,很简单 - 你不喜欢这个吗? –
如果数组是一个已知大小的(我假设大小为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;
}
请注意,这里假设'tempData'包含三个元素。这*可能是一个有效的假设,但它可能不是。 –
这是一个有效的假设:) –
@JonSkeet是的,它确实假设(基于示例代码,我已更新,以便答案突出了假设。 –
假设tempData
有3个元素使用Enum.GetName (typeof (AfpRecordId), tempData[0] * 256*256 + tempData[1] * 256 +tempData[2])
。
可能重复的[获取枚举名称,当值已知](http://stackoverflow.com/questions/3327883/get-enum-name-when-value-is-known) – Heinzi