C # daxilində yerləşdirmək üçün int daxil edin

enum int necə verə bilər?

2749
27 авг. lomaksx 27 aug. 2008-08-27 06:58 '08 at 06:58 2008-08-27 06:58
@ 23 cavab

Xətdən:

 YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString); // the foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute if (!Enum.IsDefined(typeof(YourEnum), foo)  !foo.ToString().Contains(",")) throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.") 

İnten:

 YourEnum foo = (YourEnum)yourInt; 

Yeniləmə:

Nömrədən də edə bilərsiniz

 YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt); 
3310
27 авг. cavab FlySwat 27 avqustda verilir . 2008-08-27 06:59 '08 at 6:59 'da 2008-08-27 06:59

Sadəcə buraxın:

 MyEnum e = (MyEnum)3; 
border=0

Enum.IsDefined istifadə edərək aralığın olub-olmadığını yoxlaya bilərsiniz :

 if (Enum.IsDefined(typeof(MyEnum), 3)) { ... } 
766
27 авг. Cavab Matt Hamilton 27 aug. 2008-08-27 07:01 '08 at 07:01 2008-08-27 07:01

Alternativ olaraq, bir xətt yerinə uzantı metodundan istifadə edin:

 public static T ToEnum<T>(this string enumString) { return (T) Enum.Parse(typeof (T), enumString); } 

Ərizə:

 Color colorEnum = "Red".ToEnum<Color>(); 

Və ya

 string color = "Red"; var colorEnum = color.ToEnum<Color>(); 
211
11 нояб. Abdul Munim tərəfindən verilmiş cavab 11 noyabr 2011-11-11 16:27 '11 at 16:27 2011-11-11 16:27

Hesab edirəm ki, tam cavab ala bilirəm, insanlar nasazlıqların içində necə işlədiyini bilmək lazımdır. NET.

Necə işləyir?

NET'te bir numaralandırma, bir sıra değerleri (alanlar) baz tipine (default int ) int bir int . Lakin, siyahınıza uyğun olan inteqral tipini seçə bilərsiniz:

 public enum Foo : short 

Bu halda, sayım short məlumat növünə çevrilir, yəni yaddaşda saxlanacaq və istifadə etdiyiniz və istifadə edəcəyi müddətdə qısa müddətdə davranacaqsınız.

IL baxımından baxırsınızsa, (enum, int) enum belə görünür:

 .class public auto ansi serializable sealed BarFlag extends System.Enum { .custom instance void System.FlagsAttribute::.ctor() .custom instance void ComVisibleAttribute::.ctor(bool) = { bool(true) } .field public static literal valuetype BarFlag AllFlags = int32(0x3fff) .field public static literal valuetype BarFlag Foo1 = int32(1) .field public static literal valuetype BarFlag Foo2 = int32(0x2000) // and so on for all flags or enum values .field public specialname rtspecialname int32 value__ } 

Qeyd edək ki, value__ sayım dəyərlərindən ayrı saxlanılır. Yuxarıda göstərilən Foo siyahısında, type value__ int16 olur. Bu, əsasən , növlərin uyğun olması halında istənilən şeyi bir qeyddə saxlaya bilərsiniz.

Bu nöqtədə, System.Enum bir dəyər növü olduğunu qeyd etmək istərdim ki, bu əsasən BarFlag 4 bayt BarFlag olacağını bildirir. baza tipinin ölçüsü (bu, həqiqətən, bundan daha mürəkkəbdir, amma hey ...).

Cavab

Beləliklə, bir numaralandırma ilə əlaqələndirmək istədiyiniz bir tamsayı varsa, icra zamanı yalnız 2 şeyi etməlidir: 4 bayt surəti və başqa bir şey adı (enum adı). Məlumat dəyərli bir növü kimi saxlanıldığından kopyalanma örtülüdür - bu, əsasən, idarə edilməyən kodu istifadə etsəniz, məlumatları və tamsayıları məlumatları kopyalamadan əvəz edə bilərsiniz.

Təhlükəsiz etmək üçün, ən yaxşı təcrübə əsas növlərin eyni və ya dolaysız olaraq konvertasiya olacağına və sayım dəyərlərinin mövcudluğundan əmin olmağına inanıram (onlar default tərəfindən yoxlanılır!).

Bunun necə olduğunu öyrənmək üçün aşağıdakı kodu cəhd edin:

 public enum MyEnum : int { Foo = 1, Bar = 2, Mek = 5 } static void Main(string[] args) { var e1 = (MyEnum)5; var e2 = (MyEnum)6; Console.WriteLine("{0} {1}", e1, e2); Console.ReadLine(); } 

e2 üzərinə düşmə də işlədiyini unutmayın! Yuxarıda tərtib edilən kompilyator baxımından bu mənada ToString() : value__ sahəsi sadəcə 5 və ya 6 ilə doludur və ToString() çağırdığında, e1 adı həll edilir, lakin adı e2 deyil.

Əgər bu sizin məqsədinizə uyğun deyilsə, Enum.IsDefined(typeof(MyEnum), 6) istifadə Enum.IsDefined(typeof(MyEnum), 6) olmadığını yoxlamaq üçün istifadə edin.

Həmçinin, tərtibçinin bunu təsdiq etdiyinə baxmayaraq qeydin əsas növü barədə dəqiq məlumat verəcəyəm. Bunu edəcəyəm ki, gələcəkdə sürprizlərlə qarşılaşmayacağam. Bu sürprizləri hərəkətdə görmək üçün aşağıdakı koddan istifadə edə bilərsiniz (əslində bu verilənlər bazasının kodundakı necə olduğunu gördüm):

 public enum MyEnum : short { Mek = 5 } static void Main(string[] args) { var e1 = (MyEnum)32769; // will not compile, out of bounds for a short object o = 5; var e2 = (MyEnum)o; // will throw at runtime, because o is of type int Console.WriteLine("{0} {1}", e1, e2); Console.ReadLine(); } 
132
03 апр. Cavab atlaste verilir 03 Aprel. 2014-04-03 10:39 '14 at 10:39 2014-04-03 10:39

Aşağıdakı nümunəni götürün:

 int one = 1; MyEnum e = (MyEnum)one; 
98
27 авг. Cavab abigblackman 27 avqustda verilir . 2008-08-27 07:00 '08 saat 07: 00-da, 2008-08-27 07:00

İnt mənim listeleme int'i çevirmək üçün bu kod parçasını istifadə edirəm:

 if (typeof(YourEnum).IsEnumDefined(valueToCast)) return (YourEnum)valueToCast; else { //handle it here, if its not defined } 

Hesab edirəm ki, bu ən yaxşı həlldir.

58
21 окт. MSkuta 21 oct cavab verildi . 2011-10-21 13:05 '11 at 13:05 2011-10-21 13:05

Aşağıdakılar Enums üçün yaxşı bir sinif proqramdır

 public static class EnumHelper { public static int[] ToIntArray<T>(T[] value) { int[] result = new int[value.Length]; for (int i = 0; i < value.Length; i++) result[i] = Convert.ToInt32(value[i]); return result; } public static T[] FromIntArray<T>(int[] value) { T[] result = new T[value.Length]; for (int i = 0; i < value.Length; i++) result[i] = (T)Enum.ToObject(typeof(T),value[i]); return result; } internal static T Parse<T>(string value, T defaultValue) { if (Enum.IsDefined(typeof(T), value)) return (T) Enum.Parse(typeof (T), value); int num; if(int.TryParse(value,out num)) { if (Enum.IsDefined(typeof(T), num)) return (T)Enum.ToObject(typeof(T), num); } return defaultValue; } } 
47
07 сент. Cavab Tawani 07 Sep verilir 2010-09-07 07:42 '10 da 7:42 'de 2010-09-07 07:42

Nümerik dəyərlər üçün bu daha təhlükəsizdir, çünki bir obyektin nə olursa olsun:

 public static class EnumEx { static public bool TryConvert<T>(int value, out T result) { result = default(T); bool success = Enum.IsDefined(typeof(T), value); if (success) { result = (T)Enum.ToObject(typeof(T), value); } return success; } } 
40
21 февр. Sébastien Duval tərəfindən verilmiş cavab 21 fevral. 2013-02-21 18:22 '13 'da 18:22 2013-02-21 18:22

4.0 .NET yaratmağa hazırsınızsa, çox faydalı olan və [Flags] özniteli ilə yaxşı işləyən yeni bir funksiya var Enum.TryParse (). Enum.TryParse metoduna baxın (String, TEnum%)

39
01 нояб. Cavab Ryan Russon tərəfindən verilir 01 Noyabr. 2011-11-01 17:58 '11 at 17:58 2011-11-01 17:58

Əgər bir bitmask kimi çıxış edən bir tamsayı varsa və [Bayraqlar] siyahısında bir və ya daha çox dəyərləri təmsil edə bilərsə, siyahıda fərdi bayraqların dəyərlərini təhlil etmək üçün bu kodu istifadə edə bilərsiniz:

 for (var flagIterator = 0; flagIterator < 32; flagIterator++) { // Determine the bit value (1,2,4,...,Int32.MinValue) int bitValue = 1 << flagIterator; // Check to see if the current flag exists in the bit mask if ((intValue  bitValue) != 0) { // If the current flag exists in the enumeration, then we can add that value to the list // if the enumeration has that flag defined if (Enum.IsDefined(typeof(MyEnum), bitValue)) Console.WriteLine((MyEnum)bitValue); } } 

Qeyd edək ki, enum əsas növü 32 bitlik bir tamsayıdır. Farklı sayısal bir növü olsaydı, bu cür bitləri əks etdirmək üçün sabit kodlu 32-i dəyişmək məcburiyyətindəsiniz (ya da proqramla Enum.GetUnderlyingType() istifadə edərək).

26
13 апр. cavab Evan M 13 apr tərəfindən verilir . 2011-04-13 23:13 '11 at 11:13 PM 2011-04-13 23:13

Bəzən MyEnum kimi bir obyektiniz var. Kimi

 var MyEnumType = typeof(MyEnumType); 

Sonra:

 Enum.ToObject(typeof(MyEnum), 3) 
24
02 июля '10 в 17:41 2010-07-02 17:41 cavab 02 iyul 2010-cu il tarixində saat 17: 41-də verilir

Bu bayraqların sayılması ilə təhlükəsiz bir dönüşüm üsuludur:

 public static bool TryConvertToEnum<T>(this int instance, out T result) where T: Enum { var enumType = typeof (T); var success = Enum.IsDefined(enumType, instance); if (success) { result = (T)Enum.ToObject(enumType, instance); } else { result = default(T); } return success; } 
20
30 марта '15 в 13:08 2015-03-30 13:08 Daniel Fisher lennybacon tərəfindən cavabı 30 Mart 'da 13:08' də verildi

2019

19
05 февр. Cavab Shivprasad Koirala tərəfindən verilir 05 fevral. 2014-02-05 15:15 '14 saat 15:15 'də 2014-02-05 15:15

Birincisi orijinal sualdan uzaqlaşın, amma Karu sualına cavab tapdım , intumdan int dəyərini alın . Statik bir sınıftan, public const int xüsusiyyətlərini istifadə edərək, asanlıqla əlaqəli int sabitlərinin bir dəstini toplamaq üçün imkan verir və istifadə etdikdə int ilə istifadə etməyin.

 public static class Question { public static readonly int Role = 2; public static readonly int ProjectFunding = 3; public static readonly int TotalEmployee = 4; public static readonly int NumberOfServers = 5; public static readonly int TopBusinessConcern = 6; } 

Şübhəsiz ki, belə bir sıra funksiyalar məhv olacaq, amma bir verilənlər bazası identifikator sabitlərinin saxlanılması üçün bu, çox düzgün bir həll kimi görünür.

16
17 июля '14 в 17:39 2014-07-17 17:39 Cavab 17 iyul 2014-cü il saat 17: 39-da Tedə verilir

Bu, yuxarıdakı Tawani kommunal sinfi kimi generics istifadə edərək, dot.NET 4.0-də qismən uyğunluq ilə tamsayılar və ya strings bir hədəf uyğunlaşdırır. Komanda xəttinin əsas dəyişənlərini natamam ola biləcək çevirmək üçün istifadə edirəm. Nöqtə null etibarsız olduğundan, məntiqi olaraq u mənim dəyər təmin etməlidir. Bu deyilə bilər:

 var result = EnumParser<MyEnum>.Parse(valueToParse, MyEnum.FirstValue); 

Kod burada:

 using System; public class EnumParser<T> where T : struct { public static T Parse(int toParse, T defaultVal) { return Parse(toParse + "", defaultVal); } public static T Parse(string toParse, T defaultVal) { T enumVal = defaultVal; if (defaultVal is Enum  !String.IsNullOrEmpty(toParse)) { int index; if (int.TryParse(toParse, out index)) { Enum.TryParse(index + "", out enumVal); } else { if (!Enum.TryParse<T>(toParse + "", true, out enumVal)) { MatchPartialName(toParse, ref enumVal); } } } return enumVal; } public static void MatchPartialName(string toParse, ref T enumVal) { foreach (string member in enumVal.GetType().GetEnumNames()) { if (member.ToLower().Contains(toParse.ToLower())) { if (Enum.TryParse<T>(member + "", out enumVal)) { break; } } } } } 

FYI: Heç kimin qeyd etmədiyi tamsayılar da açıqca Enum.TryParse ()

12
30 июля '14 в 23:02 2014-07-30 23:02 Cavab CZahrobsky tərəfindən 30 İyul '14 saat 23:02 2014-07-30 23:02 tərəfindən verilir

Satırdan: (Enum.Parse köhnəlmiş, Enum.TryParse istifadə edin)

 enum Importance {} Importance importance; if (Enum.TryParse(value, out importance)) { } 
12
21 нояб. Cavab 21 iyulda Will Yu tərəfindən verilir. 2014-11-21 03:32 '14 at 3:32 2014-11-21 03:32

Mənim vəziyyətimdə qeydiyyatı WCF xidmətindən qaytarmaq lazım idi. Mən də yalnız enum.ToString () deyil, dost ada ehtiyacım vardı.

İşdə mənim WCF sinifdir.

 [DataContract] public class EnumMember { [DataMember] public string Description { get; set; } [DataMember] public int Value { get; set; } public static List<EnumMember> ConvertToList<T>() { Type type = typeof(T); if (!type.IsEnum) { throw new ArgumentException("T must be of type enumeration."); } var members = new List<EnumMember>(); foreach (string item in System.Enum.GetNames(type)) { var enumType = System.Enum.Parse(type, item); members.Add( new EnumMember() { Description = enumType.GetDescriptionValue(), Value = ((IConvertible)enumType).ToInt32(null) }); } return members; } } 

Bu, Enum'dan təsvirini alan genişləndirmə metodundan istifadə edir.

  public static string GetDescriptionValue<T>(this T source) { FieldInfo fileInfo = source.GetType().GetField(source.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fileInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null  attributes.Length > 0) { return attributes[0].Description; } else { return source.ToString(); } } 

İcra:

 return EnumMember.ConvertToList<YourType>(); 
9
02 июля '14 в 17:58 2014-07-02 17:58 Cavab 02 iyul 'da saat 17:58' də LawMan tərəfindən verilir 2014-07-02 17:58

Aşağıda bir az yaxşı uzatma üsuludur.

 public static string ToEnumString<TEnum>(this int enumValue) { var enumString = enumValue.ToString(); if (Enum.IsDefined(typeof(TEnum), enumValue)) { enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString(); } return enumString; } 
9
16 дек. Cavan Kamran Şahid 16 dekabrda verilir. 2016-12-16 09:59 '16 saat 09:59 'da 2016-12-16 09:59

Enum Enum köçürmək üçün müxtəlif yollar

 enum orientation : byte { north = 1, south = 2, east = 3, west = 4 } class Program { static void Main(string[] args) { orientation myDirection = orientation.north; Console.WriteLine("myDirection = {0}", myDirection); //output myDirection =north Console.WriteLine((byte)myDirection); //output 1 string strDir = Convert.ToString(myDirection); Console.WriteLine(strDir); //output north string myString = "north"; //to convert string to Enum myDirection = (orientation)Enum.Parse(typeof(orientation),myString); } } 
7
08 янв. cavab gmail istifadəçi tərəfindən verilir 08 yanvar. 2014-01-08 18:18 '14 da 18:18 2014-01-08 18:18

Bu enum genişlənməsinin bir hissəsini aldığımı artıq bilmirəm, amma bu stackoverflow edir. Bunun üçün üzr istəyirik! Amma bunu götürdüm və bayraqları istifadə sayım üçün dəyişdirdim. Yoxlama qutuları ilə ədədlər üçün bunu etdim:

  public static class Enum<T> where T : struct { private static readonly IEnumerable<T> All = Enum.GetValues(typeof (T)).Cast<T>(); private static readonly Dictionary<int, T> Values = All.ToDictionary(k => Convert.ToInt32(k)); public static T? CastOrNull(int value) { T foundValue; if (Values.TryGetValue(value, out foundValue)) { return foundValue; } // For enums with Flags-Attribut. try { bool isFlag = typeof(T).GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0; if (isFlag) { int existingIntValue = 0; foreach (T t in Enum.GetValues(typeof(T))) { if ((value  Convert.ToInt32(t)) > 0) { existingIntValue |= Convert.ToInt32(t); } } if (existingIntValue == 0) { return null; } return (T)(Enum.Parse(typeof(T), existingIntValue.ToString(), true)); } } catch (Exception) { return null; } return null; } } 

Məsələn:

 [Flags] public enum PetType { None = 0, Dog = 1, Cat = 2, Fish = 4, Bird = 8, Reptile = 16, Other = 32 }; integer values 1=Dog; 13= Dog | Fish | Bird; 96= Other; 128= Null; 
7
07 янв. Franki1986 tərəfindən verilmiş cavab 07 Jan 2016-01-07 14:40 '16 saat 14:40 'də 2016-01-07 14:40

İstədiyiniz istifadəçi siyahısına hər hansı bir girişə çevrilməyə kömək edə bilər. Aşağıdakı kimi bir enum var deyirlər, default int edir . Əvvəlcədən dəyərini əlavə edin. Giriş qiyməti üçün heç bir uyğunlaşma olmadığında medtod yardımçıları tərəfindən istifadə olunur.

 public enum FriendType { Default, Audio, Video, Image } public static class EnumHelper<T> { public static T ConvertToEnum(dynamic value) { var result = default(T); var tempType = 0; //see Note below if (value != null  int.TryParse(value.ToString(), out tempType)  Enum.IsDefined(typeof(T), tempType)) { result = (T)Enum.ToObject(typeof(T), tempType); } return result; } } 

NB: Burada int dəyərini ayrıştırmaya çalışıram, çünki enum, byte tipinə bənzər bir sayım müəyyən edərsə, u mənim int .

 public enum MediaType : byte { Default, Audio, Video, Image } 

Yardımçı üsuldan ayrıştırmayı dəyişdirməlisiniz

 int.TryParse(value.ToString(), out tempType) 

üçün

byte.TryParse(value.ToString(), out tempType)

Aşağıdakı girişlər üçün metodu test etdim

 EnumHelper<FriendType>.ConvertToEnum(null); EnumHelper<FriendType>.ConvertToEnum(""); EnumHelper<FriendType>.ConvertToEnum("-1"); EnumHelper<FriendType>.ConvertToEnum("6"); EnumHelper<FriendType>.ConvertToEnum(""); EnumHelper<FriendType>.ConvertToEnum("2"); EnumHelper<FriendType>.ConvertToEnum(-1); EnumHelper<FriendType>.ConvertToEnum(0); EnumHelper<FriendType>.ConvertToEnum(1); EnumHelper<FriendType>.ConvertToEnum(9); 

İngilisim üçün üzr istəyirik

6
17 нояб. Cavab verilir reza.cse08 17 noyabr. 2016-11-17 15:49 '16 at 15:49 2016-11-17 15:49

C # -də enum etmək int üçün sadə və sadə bir yol:

  public class Program { public enum Color : int { Blue = 0, Black = 1, Green = 2, Gray = 3, Yellow =4 } public static void Main(string[] args) { //from string Console.WriteLine((Color) Enum.Parse(typeof(Color), "Green")); //from int Console.WriteLine((Color)2); //From number you can also Console.WriteLine((Color)Enum.ToObject(typeof(Color) ,2)); } } 
3
08 дек. Cavab Məhəmməd Aziz Nabizada tərəfindən verilir. 08 dekabr. 2018-12-08 08:06 '18 də 8:06 'də 2018-12-08 08:06

Yalnızca enum və ya enum int üçün açıq bir cast cast int istifadə

 class Program { static void Main(string[] args) { Console.WriteLine((int)Number.three); //Output=3 Console.WriteLine((Number)3);// Outout three Console.Read(); } public enum Number { Zero = 0, One = 1, Two = 2, three = 3 } } 
0
01 февр. Cavab Shivam Mishra tərəfindən verilir 01 Fevral. 2019-02-01 13:15 '19 saat 13:15 'də 2019-02-01 13:15