2010-06-01 9 views
7

क्या सी # में सिर्फ संख्याओं का उपयोग करके एक enum बनाना संभव है? मेरे प्रोग्राम में मेरे पास एक वैरिएबल है, लाभ, जिसे केवल 1, 2, 4, और 8 पर सेट किया जा सकता है। मैं इस मान को प्रदर्शित करने और सेट करने के लिए एक प्रॉपर्टीग्रिड नियंत्रण का उपयोग कर रहा हूं। अगर मैं इस तरह की एक enum बनाने के लिए ...मैं संख्याओं का उपयोग करके एक enum कैसे बना सकते हैं?

private enum GainValues {One, Two, Four, Eight} 

थे और मैं प्रकार GainValues ​​की मेरी लाभ चर तो PropertyGrid में ड्रॉप-डाउन सूची बनाई केवल लाभ चर के लिए उपलब्ध मान दिखाएगी। समस्या यह है कि मैं लाभ मानों को संख्यात्मक रूप से शब्दों के रूप में नहीं पढ़ना चाहता हूं। लेकिन मैं इस तरह एक enum नहीं बना सकता:

private enum GainValues {1,2,4,8} 

तो ऐसा करने का एक और तरीका है? शायद एक कस्टम प्रकार का निर्माण?

उत्तर

15

यह enums काम नहीं है। एक गणना आपको एक विशिष्ट मान का नाम देने की अनुमति देती है ताकि आप इसे अपने कोड में अधिक समझदारी से संदर्भित कर सकें।

यदि आप वैध संख्यात्मक डोमेन को सीमित करना चाहते हैं, तो enums सही विकल्प नहीं हो सकता है। एक वैकल्पिक, सिर्फ इतना है कि लाभ के रूप में इस्तेमाल किया जा सकता मान्य मान का एक संग्रह बनाने के लिए है:

private int[] ValidGainValues = new []{ 1, 2, 4, 8}; 

आप इस अधिक typesafe बनाना चाहते हैं, तो आप भी एक कस्टम प्रकार एक निजी निर्माता के साथ बना सकते हैं, सभी मान्य मानों को स्थैतिक, सार्वजनिक उदाहरणों के रूप में परिभाषित करें, और फिर उन्हें इस तरह से बेनकाब करें। लेकिन आपको अभी भी प्रत्येक मान्य मान को एक नाम देना होगा - क्योंकि सी # सदस्य/परिवर्तनीय नाम किसी संख्या से शुरू नहीं हो सकते हैं (हालांकि वे उन्हें शामिल कर सकते हैं)।

अब अगर आप वास्तव में क्या चाहते हैं, एक GainValues ​​गणन, में प्रविष्टियों जो आप कर सकते करने के लिए विशिष्ट प्रदान करना है:

private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 }; 
+0

आप संभवतः स्कोप आवश्यकताओं के आधार पर इस स्थिर पाठ को, और शायद आंतरिक या सार्वजनिक बनाना चाहते हैं, लेकिन हाँ, यह सबसे अच्छा समाधान है। –

+0

@Cylon Cat: हां, स्थैतिक/पठनीय के बारे में अच्छी बात है, यद्यपि अभ्यास में, आपको वास्तव में अपरिवर्तनीयता को लागू करने के लिए एक सरणी के बजाय सूची जैसे संग्रह की आवश्यकता होगी। – LBushkin

4
private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 } 

काम करना चाहिए।

अद्यतन: ठीक है, मुझे लगता है कि मैंने आपको वहां गलत समझा।

शायद आप KeyValuePair<string, int> का उपयोग कर सकते हैं और फिर नाम और मूल्य को क्रमशः कुंजी और मूल्य संपत्ति में बाध्य कर सकते हैं।

+0

यह स्पष्ट नहीं है कि ओपी क्या ढूंढ रहा है। ऐसा लगता है कि वह संख्यात्मक शाब्दिक मूल्यों का उपयोग गणना सदस्यों के * नाम * के रूप में करना चाहता है - जो अवैध है। – LBushkin

+0

@LBushkin: विवरण दिया गया है यह _probably_ क्या ओपी चाहता है। –

+0

@ हेंक: मुझे इतना यकीन नहीं है, ओपी लिखता है: 'समस्या यह है कि मैं चाहता हूं कि लाभ मूल्य संख्यात्मक रूप से शब्दों के रूप में न पढ़ें।' मेरी व्याख्या यह है कि ओपी वैध मूल्यों की सीमित सूची चाहता है, बजाय लाभ के लिए एक नामित गणना। – LBushkin

0

उपयोग enum में स्पष्ट मूल्य असाइनमेंट:

:

GainValues currentVal; 

foreach(currentVal in Enum.GetValues(typeof(GainValues)) 
{ 
    // add to combo box (or whatever) here 
} 

तो फिर तुम ints के रूप में आवश्यक से/डाली कर सकते हैं:

private enum GainValues 
{ 
    One = 1, 
    Two = 2, 
    Four = 4, 
    Eight = 8 
} 

तो इन मूल्यों के माध्यम से गणना करने में इस प्रकार करना

int valueFromDB = 4; 

GainValues enumVal = (GainValues) valueFromDB; 

// enumVal should be 'Four' now 
0

दुर्भाग्य से, सी # में प्रतीकों संख्या हो सकती हैं, लेकिन प्रारंभ नहीं कर सकता संख्याओं के साथ। तो आपको शब्दों का उपयोग करना होगा।

वैकल्पिक रूप से, आप Gain1, Gain2, आदि

कर सकता है या आप एक enum पूरी तरह छोड़ और स्थिरांक और आंतरिक प्रक्रिया इस्तेमाल कर सकते हैं।

0

आप अपनी ड्रॉप डाउन सूची के लिए डेटास्रोत के रूप में एक कस्टम सूची का उपयोग कर सकते हैं।

पीछे कोड:

using GainItem = KeyValuePair<string, int>; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      List<GainItem> dic = new List<GainItem>(); 
      dic.Add(new GainItem("First", 1)); 
      dic.Add(new GainItem("Second", 2)); 
      dic.Add(new GainItem("Fourth", 4)); 
      ddl.DataSource = dic; 
      ddl.DataBind(); 
     } 


    } 

    protected void btn_Click(object sender, EventArgs e) 
    { 
     Response.Write(ddl.SelectedValue); 
    } 
} 

Asp पृष्ठ:

<div> 
    <asp:DropDownList runat="server" ID="ddl" DataValueField="Value" DataTextField="Key" /> 
    <asp:Button ID="btn" runat="server" OnClick="btn_Click" /> 
    </div> 

इसके अलावा, आप की स्थापना डिफ़ॉल्ट मान के लिए enum हो सकता है, ...

आशा है कि यह मदद करता है

5

अगर मैं मूल प्रश्न सही ढंग से समझ गया, तो उत्तर यह हो सकता है:

आप बस, एक अंडरस्कोर उपसर्ग का उपयोग करके उदाहरण के द्वारा निरीक्षक में एक enum में सूचीबद्ध नंबर प्राप्त कर सकते हैं:

public enum MyNumbers{ _1, _2, _3, _4 }; 
public MyNumbers myNumbers; 

आशा यह है मदद करता है!

10

इस पर पहले से ही काफी जवाब दिए गए हैं, हालांकि मैं एक और समाधान प्रदान करूंगा। यदि आप अपने नियंत्रण में संख्या के लिए अंग्रेजी शब्द के विपरीत एक वास्तविक संख्या दिखाने के लिए अपना नियंत्रण चाहते हैं तो आप डेटा एनोटेशन का उपयोग कर सकते हैं।

using System.ComponentModel.DataAnnotations; 

private enum GainValues 
{ 
[Display(Name = "1")] 
One, 
[Display(Name = "2")] 
Two, 
[Display(Name = "4")] 
Four, 
[Display(Name = "8")] 
Eight 
} 

यह आपके प्रोग्राम में कहीं भी उपयोगी है जहां आप किसी सदस्य के वास्तविक नाम के विपरीत एक दोस्ताना नाम का उपयोग करना चाहते हैं।

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

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