दिलचस्प पोस्ट
ViewController का जवाब TOSelector: संदेश को deallocated उदाहरण (CRASH) को भेजा गया आधुनिक RDBMS पर इनलाइन स्टेटमेंट की तुलना में, सामान्य रूप से संसाधित प्रक्रियाएं अधिक कुशल हैं? सूची में अधिकतम () / मिनट () का उपयोग करते हुए लौटे हुए अधिकतम या न्यूनतम आइटम का सूचकांक प्राप्त करना दबाए जाने के लिए प्रतीक्षा किए बिना मानक इनपुट से अक्षर कैप्चर करें स्थानीय फ़ाइलों को पढ़ने के लिए AJAX का उपयोग करना IE9 क्यों मेरी वेबसाइट पर संगतता मोड पर स्विच करता है? प्रभाव के साथ एपेंड का उपयोग jQuery Jquery कोड शीर्ष लेख या पाद लेख में जाना चाहिए? मैं विंडोज़ में बाल प्रक्रियाओं को स्वचालित रूप से कैसे नष्ट कर सकता हूं? C ++ – GetUserName () जब प्रक्रिया व्यवस्थापक के रूप में चलाया जाता है JSON को सरणी कन्वर्ट करें रिमोट जीआईटी रिपॉजिटरी में किए गए संशोधन को मैं कैसे संशोधित कर सकता हूं? मैं एक मूल्य के खिलाफ एकाधिक चर कैसे परीक्षण करूं? SQL सर्वर में CSV फ़ाइल आयात करें एचटीएमएल 5 प्लेसहोल्डर फोकस पर गायब हो जाता है

मैं सी # में एक सूची में एक enum कैसे परिवर्तित करूं?

क्या एक enum को सूची में कनवर्ट करने का एक तरीका है जिसमें सभी एंउम के विकल्प शामिल हैं?

वेब के समाधान से एकत्रित समाधान "मैं सी # में एक सूची में एक enum कैसे परिवर्तित करूं?"

यह एक Enum के सभी मानों के एक IEnumerable<SomeEnum> वापस करेगा

 Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>(); 

यदि आप चाहते हैं कि एक List<SomeEnum> , बस जोड़ें .ToList() बाद .Cast<SomeEnum>()

एक अर्रे पर कास्ट समारोह का उपयोग करने के लिए आपको सिस्टम का उपयोग करने की आवश्यकता है। System.Linq आपके उपयोग अनुभाग में

बहुत आसान तरीका:

 Enum.GetValues(typeof(SomeEnum)) .Cast<SomeEnum>() .Select(v => v.ToString()) .ToList(); 

संक्षिप्त जवाब है, इसका प्रयोग करें:

 (SomeEnum[])Enum.GetValues(typeof(SomeEnum)) 

यदि आपको स्थानीय वैरिएबल के लिए इसकी आवश्यकता है, तो यह सब सभी var allSomeEnumValues = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));

वाक्यविन्यास इस तरह क्यों है ?!

static विधि GetValues पुराने एनईटी 1.0 दिनों में वापस पेश किया गया था। यह रनटाइम प्रकार SomeEnum[] का एक-आयामी सरणी SomeEnum[] लेकिन चूंकि यह एक गैर-सामान्य पद्धति है (जेनेटिक्स को .NET 2.0 तक शुरू नहीं किया गया था), यह इसके रिटर्न प्रकार (संकलन समय वापसी प्रकार) की घोषणा नहीं कर सकता है।

.NET arrays का एक प्रकार का संप्रभु होता है, लेकिन क्योंकि SomeEnum एक वैल्यू प्रकार होगा , और क्योंकि सरणी प्रकार के SomeEnum मूल्य प्रकारों के साथ काम नहीं करते हैं, वे किसी object[] या Enum[] रूप में वापसी प्रकार को भी घोषित नहीं कर सके। (यह उदा । GetCustomAttributes इस अधिभार से अलग है, जो कि संकलन-टाइम रिटर्न टाइप object[] संकलित समय के प्रकार के object[] लेकिन वास्तव में SomeAttribute[] की एक सरणी देता है जहां कुछ SomeAttribute अनिवार्य रूप से एक संदर्भ प्रकार है।)

इस वजह से, .NET 1.0 विधि को सिस्टम के रूप में इसके रिटर्न प्रकार को घोषित करना पड़ा। System.Array लेकिन मैं आपको गारंटी देता हूं कि यह कुछ SomeEnum[]

हर बार जब आप GetValues को एक ही एंम प्रकार से कहते हैं, तो उसे एक नया सरणी आवंटित करना होगा और मूल्यों को नए सरणी में कॉपी करना होगा। ऐसा इसलिए है क्योंकि सरणियों को विधि के "उपभोक्ता" द्वारा (संशोधित) लिखा जा सकता है, इसलिए उन्हें यह सुनिश्चित करने के लिए एक नया सरणी बनाना होगा कि मान अपरिवर्तित हैं। .NET 1.0 में केवल पढ़ने योग्य संग्रह नहीं थे।

अगर आपको सभी मूल्यों की कई अलग-अलग जगहों की सूची की आवश्यकता हो, तो सिर्फ एक बार GetValues पर कॉल करें और परिणाम केवल पढ़ने के लिए आवरण में कैश करें, उदाहरण के लिए:

 public static readonly ReadOnlyCollection<SomeEnum> AllSomeEnumValues = Array.AsReadOnly((SomeEnum[])Enum.GetValues(typeof(SomeEnum))); 

उसके बाद आप AllSomeEnumValues कई बार उपयोग कर सकते हैं, और एक ही संग्रह सुरक्षित रूप से पुन: उपयोग किया जा सकता है।

इसका उपयोग करने के लिए क्यों बुरा है। .Cast<SomeEnum>() ?

कई अन्य उत्तर का उपयोग करते हैं .Cast<SomeEnum>() इस के साथ समस्या यह है कि यह Array वर्ग के गैर-सामान्य IEnumerable कार्यान्वयन का उपयोग करता है। इसने प्रत्येक मूल्य को एक System.Object में शामिल करना चाहिए। System.Object बॉक्स, और फिर Cast<> का उपयोग करके Cast<> विधि उन सभी मानों को फिर से अनबॉक्सित करने के लिए। सौभाग्य से .Cast<> विधि संग्रह के माध्यम से फिर से शुरू होने से पहले इसके IEnumerable पैरामीटर ( this पैरामीटर) के क्रम प्रकार को .Cast<> लगता है, इसलिए यह सभी के बाद यह बुरा नहीं है। इसे बाहर .Cast<>

यदि आप इसे .ToArray() या .ToList() द्वारा पालन करते हैं, तो .ToArray() :

 Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList() // DON'T do this 

आपके पास एक अन्य समस्या है: जब आप GetValues कॉल करते हैं और फिर एक नया संग्रह (ऐरे) बनाते हैं, तो फिर। के साथ एक नया संग्रह ( List<> ) .ToList() । इसलिए मूल्यों को रखने के लिए एक संपूर्ण संग्रह के एक (अतिरिक्त) बेमानी आवंटन है

 List <SomeEnum> theList = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList(); 

LINQ का उपयोग करके, मैं जिस तरह से प्यार करता हूं, वह यहाँ है:

 public class EnumModel { public int Value { get; set; } public string Name { get; set; } } public enum MyEnum { Name1=1, Name2=2, Name3=3 } public class Test { List<EnumModel> enums = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => new EnumModel() { Value = (int)c, Name = c.ToString() }).ToList(); } 

आशा करता हूँ की ये काम करेगा

बहुत आसान जवाब

यहां एक संपत्ति है जो मैं अपने अनुप्रयोगों में से एक में उपयोग करता हूं

 public List<string> OperationModes { get { return Enum.GetNames(typeof(SomeENUM)).ToList(); } } 

मैं हमेशा इस तरह enum मानों की एक सूची प्राप्त करने के लिए उपयोग किया है:

 Array list = Enum.GetValues(typeof (SomeEnum)); 

यहां उपयोगिता के लिए … एक सूची में मान प्राप्त करने के लिए कुछ कोड है, जो मान के लिए पाठ के लिए पठनीय रूप में कनवर्ट करता है

 public class KeyValuePair { public string Key { get; set; } public string Name { get; set; } public int Value { get; set; } public static List<KeyValuePair> ListFrom<T>() { var array = (T[])(Enum.GetValues(typeof(T)).Cast<T>()); return array .Select(a => new KeyValuePair { Key = a.ToString(), Name = a.ToString().SplitCapitalizedWords(), Value = Convert.ToInt32(a) }) .OrderBy(kvp => kvp.Name) .ToList(); } } 

.. और समर्थन प्रणाली। एक्सटेंशन विस्तार विधि:

 /// <summary> /// Split a string on each occurrence of a capital (assumed to be a word) /// eg MyBigToe returns "My Big Toe" /// </summary> public static string SplitCapitalizedWords(this string source) { if (String.IsNullOrEmpty(source)) return String.Empty; var newText = new StringBuilder(source.Length * 2); newText.Append(source[0]); for (int i = 1; i < source.Length; i++) { if (char.IsUpper(source[i])) newText.Append(' '); newText.Append(source[i]); } return newText.ToString(); } 
 Language[] result = (Language[])Enum.GetValues(typeof(Language)) 
 public class NameValue { public string Name { get; set; } public object Value { get; set; } } public class NameValue { public string Name { get; set; } public object Value { get; set; } } public static List<NameValue> EnumToList<T>() { var array = (T[])(Enum.GetValues(typeof(T)).Cast<T>()); var array2 = Enum.GetNames(typeof(T)).ToArray<string>(); List<NameValue> lst = null; for (int i = 0; i < array.Length; i++) { if (lst == null) lst = new List<NameValue>(); string name = array2[i]; T value = array[i]; lst.Add(new NameValue { Name = name, Value = value }); } return lst; } 

कन्वर्ट Enum सूची में अधिक जानकारी यहां उपलब्ध है ।

 /// <summary> /// Method return a read-only collection of the names of the constants in specified enum /// </summary> /// <returns></returns> public static ReadOnlyCollection<string> GetNames() { return Enum.GetNames(typeof(T)).Cast<string>().ToList().AsReadOnly(); } 

जहां टी एक प्रकार का गणन है; इसे जोड़ो:

 using System.Collections.ObjectModel; 
 private List<SimpleLogType> GetLogType() { List<SimpleLogType> logList = new List<SimpleLogType>(); SimpleLogType internalLogType; foreach (var logtype in Enum.GetValues(typeof(Log))) { internalLogType = new SimpleLogType(); internalLogType.Id = (int) (Log) Enum.Parse(typeof (Log), logtype.ToString(), true); internalLogType.Name = (Log)Enum.Parse(typeof(Log), logtype.ToString(), true); logList.Add(internalLogType); } return logList; } 

शीर्ष कोड में, लॉग एक Enum और SimpleLogType लॉग के लिए एक संरचना है।

 public enum Log { None = 0, Info = 1, Warning = 8, Error = 3 } 

आप निम्न सामान्य विधि का उपयोग कर सकते हैं:

  public static List<T> GetItemsList<T>(this int enums) where T : struct, IConvertible { if (!typeof (T).IsEnum) { throw new Exception("Type given must be an Enum"); } return (from int item in Enum.GetValues(typeof (T)) where (enums & item) == item select (T) Enum.Parse(typeof (T), item.ToString(new CultureInfo("en")))).ToList(); } 

यदि आप Enum int को कुंजी और नाम के रूप में मान चाहते हैं, तो अच्छा है अगर आप डेटाबेस को नंबर संचय कर रहे हैं और यह Enum से है!

 void Main() { ICollection<EnumValueDto> list = EnumValueDto.ConvertEnumToList<SearchDataType>(); foreach (var element in list) { Console.WriteLine(string.Format("Key: {0}; Value: {1}", element.Key, element.Value)); } /* OUTPUT: Key: 1; Value: Boolean Key: 2; Value: DateTime Key: 3; Value: Numeric */ } public class EnumValueDto { public int Key { get; set; } public string Value { get; set; } public static ICollection<EnumValueDto> ConvertEnumToList<T>() where T : struct, IConvertible { if (!typeof(T).IsEnum) { throw new Exception("Type given T must be an Enum"); } var result = Enum.GetValues(typeof(T)) .Cast<T>() .Select(x => new EnumValueDto { Key = Convert.ToInt32(x), Value = x.ToString(new CultureInfo("en")) }) .ToList() .AsReadOnly(); return result; } } public enum SearchDataType { Boolean = 1, DateTime, Numeric }