2011-11-02 11 views
6

मैं निम्नलिखित Enum घोषणा की है के आधार पर Enum नाम प्राप्त करें:Enum मूल्य

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

और मैं enum वस्तु पुनः प्राप्त करने के मूल्य से हैं:

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

संभावित डुप्लिकेट [मूल्य ज्ञात होने पर enum नाम प्राप्त करें] (http://stackoverflow.com/questions/3327883/get-enum-name-when-value-is-known) – Heinzi

उत्तर

9

सरल:

  • एक int में कन्वर्ट बाइट सरणी
  • परिणाम पर कास्ट intAfpRecordId
  • के लिए कॉल ToString (या तो स्वयं या एक चार बाइट सरणी बनाने और BitConverter.ToInt32 का उपयोग करके) यदि आवश्यक हो (आपकी विषय पंक्ति नाम प्राप्त करने का सुझाव देती है, लेकिन आपकी विधि हस्ताक्षर केवल मूल्य के बारे में बात करता है)

उदाहरण के लिए:

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 उपयोग कर सकते हैं।

प्रदर्शन के लिए - जांचें कि कुछ आसान आपको कुछ तेज़ी से देखने से पहले पर्याप्त प्रदर्शन प्रदान करता है या नहीं।

+0

पर मुझे बाइट को बदलने के लिए मजबूर होना पड़ा एक int के लिए सरणी? अगर मुझे यह सही लगता है तो "बीआरजी = 0xD3A8C6" को बाइट [] के रूप में पहचाना नहीं गया है? –

+0

मुझे नहीं लगता कि वह वास्तव में एक स्ट्रिंग की तलाश में है (मैंने मूल रूप से भी सोचा था) यदि आप अपने बॉयलर प्लेट विधि के रिटर्न प्रकार को देखते हैं तो यह enum –

+3

@Duncan_McCloud का मान देता है: वास्तव में, '0xd3a8c6' एक है 'int' शाब्दिक, बाइट सरणी नहीं। बाइट सरणी को एक int में बदलने से परे अन्य तरीके हैं, लेकिन वे प्रभावी रूप से कुछ समान रूप से उबाल लेंगे, और अधिक जटिल हो जाएंगे। यह कोड बेहद तेज़ होना चाहिए, और यह अच्छा और सरल है - आपको इसके बारे में क्या पसंद नहीं है? –

1

सरणी एक ज्ञात आकार का है, तो आप तत्वों को एक साथ जोड़ सकते हैं और कलाकारों enum

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

एक अलग करने के लिए परिणाम (मैं आकार मान लेंगे अपने उदाहरण के अनुसार 3) दृष्टिकोण पारी ऑपरेटर बजाय

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

ध्यान दें कि यह मानता है कि 'tempData' में तीन तत्व हैं। वह * मान्य धारणा हो सकती है, लेकिन यह नहीं हो सकती है। –

+0

यह एक वैध धारणा है :) –

+0

@ जोन्स स्केट हां यह मानता है कि (नमूना कोड के आधार पर। मैंने अद्यतन किया है ताकि उत्तर धारणा को हाइलाइट कर सके। टिप्पणी के लिए धन्यवाद –

1

मान लिया जाये कि tempData है कि 3 तत्वों Enum.GetName (typeof (AfpRecordId), tempData[0] * 256*256 + tempData[1] * 256 +tempData[2]) का उपयोग का उपयोग करने के लिए होगा।

संबंधित मुद्दे