2011-11-02 266 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])