2011-11-02 23 views
6

Enum değerine dayanarak Enum adı alın:Aşağıdaki Enum ilan ettiler

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

ve ben değerdir gelen enum nesneyi almak istiyorum:

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

Çağrı Örnekler:

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

//tempId should be equals to AfpRecordId.BRG 

Ayrıca linq veya lambda kullanmak istiyorum, sadece daha iyi veya eşit performans verebilirlerse.

+0

olası bir kopyası [değer bilinirken enum adını al] (http://stackoverflow.com/questions/3327883/get-enum-name-when-value-is-known) – Heinzi

cevap

9

Basit:

  • sonucu int
  • AfpRecordId için Çağrı ToString dökme (el ile ya da bir dört bit dizisi oluşturma ve BitConverter.ToInt32 kullanarak) bir int bayt dizisi dönüştürme gerekirse (konu satırınız adın alınmasını önerir, ancak yöntem imzanız yalnızca değer hakkında konuşur)
Örneğin

:

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; 
} 

Sen veriler aslında bir geçerli kimliği olup olmadığını kontrol etmek Enum.IsDefined kullanabilirsiniz.

Performansa gelince - daha hızlı bir şey aramadan önce basit bir şeyin size yeterli performans gösterip göstermediğini kontrol edin.

+0

Baytları dönüştürmek zorundayım int için dizi? Doğru anladım "BRG = 0xD3A8C6" değeri bir bayt [] olarak tanınmadı mı? –

+0

Aslında bir dize aradığını sanmıyorum (başlangıçta da düşündüm) Kazan plakası yönteminin dönüş türüne bakarsanız, –

+3

@Duncan_McCloud değerinin bir değerini döndürür: Gerçekten de, '0xd3a8c6' bir int 'literal, bir bayt dizisi değil. Bayt dizisini bir int'ye dönüştürmenin ötesinde başka yollar olsa da, benzer bir şeye etkili bir şekilde kaynatırlar ve daha karmaşık olurlar. Bu kod çok hızlı olmalı ve güzel ve basit - bu konuda ne sevmiyorsun? –

1

dizisi bilinen bir boyutta ise enum

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

farklı etmek Sonuç birlikte öğeleri ekleyebilirsiniz ve dökme (ı boyutunu varsayıyoruz sizin örnek başına 3'tür) yaklaşım yerine

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

Bu, tempData'nın üç öğeye sahip olduğunu varsayar. Bu * geçerli bir varsayım olabilir, ancak olmayabilir. –

+0

Bu geçerli bir varsayımdır :) –

+0

@JonSkeet evet (örnek koduna dayanarak.) Bu yanıtın varsayımı vurguladığı şekilde güncellediğimi varsayar. –

1

tempData sahip 3 elemanları Enum.GetName (typeof (AfpRecordId), tempData[0] * 256*256 + tempData[1] * 256 +tempData[2]) kullanmak varsayarsak kaydırma operatörü kullanmak olacaktır.