Cümlədən enumdən int alın

Questions adlı bir sinif var (çoğul). Bu sinifdə Question (tək) olaraq adlandırılan bir qeyd var ki, bu da belədir.

 public enum Question { Role = 2, ProjectFunding = 3, TotalEmployee = 4, NumberOfServers = 5, TopBusinessConcern = 6 } 

Questions sinifində mən bu foo üçün Questions obyektini qaytaran bir get(int foo) funksiyası var. Questions.Get(Question.Role) kimi bir şey edə biləcəyimi üçün bir enumdan tam dəyər almaq üçün asan bir yol varmı?

1460
03 июня '09 в 9:46 2009-06-03 09:46 İyun 03 '09' da saat 09:46 'da jim tərəfindən təyin olundu. 2009-06-03 09:46
@ 25 cavab

Yalnız siyahısı daxil edin, məsələn.

 int something = (int) Question.Role; 

Yuxarıda göstərilən enumun əsas növü int olduğu üçün, vahiddə gördüyünüz ədədlərin böyük əksəriyyəti üçün işləyəcəkdir.

Lakin, cecilphillip qeyd kimi, enums müxtəlif əsas növləri ola bilər. Bir numaralandırma uint , long və ya long kimi elan uint , hesablama tipinə keçirilməlidir; məsələn, üçün

 enum StarsInMilkyWay:long {Sun = 1, V645Centauri = 2 .. Wolf424B = 2147483649}; 

istifadə etməlisiniz

 long something = (long)StarsInMilkyWay.Wolf424B; 
1902
03 июня '09 в 9:49 2009-06-03 09:49 Cavab Tetraneutron tərəfindən verilir 03 iyun '09 9:49 2009-06-03 09:49

Enums hər hansı bir integral növü ( byte , int , short və s.) Ola biləcəyi üçün, bir ədədin əsas inteqral dəyərini almaq üçün daha etibarlı bir üsul GetTypeCode metodunu Convert sinfi ilə birlikdə istifadə etməkdir:

 enum Sides { Left, Right, Top, Bottom } Sides side = Sides.Bottom; object val = Convert.ChangeType(side, side.GetTypeCode()); Console.WriteLine(val); 
border=0

Bu, əsas inteqral növündən asılı olmayaraq işləməlidir.

251
09 июля '10 в 17:54 2010-07-09 17:54 Cavab cecilphillip tərəfindən verilir 09 iyul '10, 17:54 2010-07-09 17:54

İctimai sabitləri olan statik bir sinif olaraq bildirin:

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

Və sonra onu Question.Role kimi istinad edə bilərsiniz və həmişə int və ya onu müəyyən etdiyiniz hər şeyi qiymətləndirir.

166
15 июня '12 в 22:28 2012-06-15 22:28 Cavab PablosBicicleta tərəfindən 15 İyun 2012 günü saat 10: 28-da verilir. 2012-06-15 22:28
 Question question = Question.Role; int value = (int) question; 

Nəticə value == 2 dir.

74
03 июня '09 в 9:48 2009-06-03 09:48 Cavab jerryjvl 03 iyun 09:48 da verilir. 2009-06-03 09:48

System.Enum int dəyərini almaq istəyirsinizsə, uyğun qeyddə, e burada System.Enum :

 Enum e = Question.Role; 

Siz istifadə edə bilərsiniz:

 int i = Convert.ToInt32(e); int i = (int)(object)e; int i = (int)Enum.Parse(e.GetType(), e.ToString()); int i = (int)Enum.ToObject(e.GetType(), e); 

Son iki çirkindir. Birincisini üstün tuturam.

58
01 дек. Cavab verilir 01 dekabr. 2013-12-01 11:47 '13 'da 11:47' də 2013-12-01 11:47

Bu düşündüyünüzdən daha sadədir - enum zaten bir intdur. Xatırlatmaq lazımdır:

 int y = (int)Question.Role; Console.WriteLine(y); // prints 2 
35
03 июня '09 в 9:51 2009-06-03 09:51 Cavab Michael Petrotta tərəfindən 03.06 'da 09:51 ' da verildi. 2009-06-03 09:51

Məsələn:

 public Enum EmpNo { Raj = 1, Rahul, Priyanka } 

Və kodlaşdırma dəyərini almaq üçün kodda:

 int setempNo = (int)EmpNo.Raj; //This will give setempNo = 1 

və ya

 int setempNo = (int)EmpNo.Rahul; //This will give setempNo = 2 

Enums 1 artacaq və ilk dəyərini təyin edə bilərsiniz. Başlanğıc dəyərini təyin etmədiyiniz təqdirdə əvvəlcə 0-ə təyin olunacaq.

25
25 сент. cavab cavabı verilir . 2009-09-25 13:43 '09 da 13:43 'da, 2009-09-25 13:43

Mən qorunan konstruktorlar və əvvəlcədən təyin edilmiş statik nümunələr (Roelof sayəsində - C # sayğacların etibarlı qiymətləri gələcək metodu olduğundan əmin olun) ilə istifadə etmək əvəzinə kodlarımdakı kodları istifadə etməmişəm.

Aşağıdakı işığın içindəyəm, indi bu problemə gəldim ( int / int üçün örtülü dönüşüm daxil olmaqla).

 public class Question { // Attributes protected int index; protected string name; // Go with a dictionary to enforce unique index //protected static readonly ICollection<Question> values = new Collection<Question>(); protected static readonly IDictionary<int,Question> values = new Dictionary<int,Question>(); // Define the "enum" values public static readonly Question Role = new Question(2,"Role"); public static readonly Question ProjectFunding = new Question(3, "Project Funding"); public static readonly Question TotalEmployee = new Question(4, "Total Employee"); public static readonly Question NumberOfServers = new Question(5, "Number of Servers"); public static readonly Question TopBusinessConcern = new Question(6, "Top Business Concern"); // Constructors protected Question(int index, string name) { this.index = index; this.name = name; values.Add(index, this); } // Easy int conversion public static implicit operator int(Question question) => question.index; //nb: if question is null this will return a null pointer exception public static implicit operator Question(int index) => values.TryGetValue(index, out var question) ? question : null; // Easy string conversion (also update ToString for the same effect) public override string ToString() => this.name; public static implicit operator string(Question question) => question?.ToString(); public static implicit operator Question(string name) => name == null ? null : values.Values.FirstOrDefault(item => name.Equals(item.name, StringComparison.CurrentCultureIgnoreCase)); // If you specifically want a Get(int x) function (though not required given the implicit converstion) public Question Get(int foo) => foo; //(implicit conversion will take care of the conversion for you) } 

Bu yanaşmanın üstünlüyü ondan ibarətdir ki, hər hansı bir şeyi əldə etsəniz, kodunuz artıq daha çevikdir, beləliklə Question dəyərinə əsasən müxtəlif tədbirlər görməlisiniz, məntiqi Question özündə (yəni, hər bir ssenarini həll etmək üçün kodunuzdakı vəziyyətlərin bir çox təsviri verməkdən fərqli olaraq, seçilmiş şəkildə OO).


NB: C # 6 funksiyasından istifadə etmək üçün cavab yenilənir 2018-04-27; yəni, bəyanat ifadələri və bədən ifadələri lambda ifadələri. Manba kodunun dəyişdirilməsinə baxın. Bu tərifi bir az daha detallı etmək mantiqidir; bu cavab yanaşması ilə bağlı əsas şikayətlərdən biridir.

19
30 марта '13 в 4:08 2013-03-30 04:08 Cavab JohnLBevan tərəfindən 30 Mart 2013 , saat 04:08 da verilir. 2013-03-30 04:08

Bir nümunədə, məsələn, istifadə üçün, məsələn bir metodda dəyişən bir dəyişkəndə saxlanılan sayım dəyərinə bir tamsayı almaq istəyirsinizsə, sadəcə bunu edə bilərsiniz, bu nümunəni yazdım:

 enum Talen { Engels = 1, Italiaans = 2, Portugees = 3, Nederlands = 4, Duits = 5, Dens = 6 } Talen Geselecteerd; public void Form1() { InitializeComponent() Geselecteerd = Talen.Nederlands; } // You can use the Enum type as a parameter, so any enumeration from any enumerator can be used as parameter void VeranderenTitel(Enum e) { this.Text = Convert.ToInt32(e).ToString(); } 

Bu, Geselecteerd dəyişəninin Geselecteerd bərabər olduğu üçün pəncərə başlığını 4-ə Talen.Nederlands . Mən Talen.Portugees üçün Talen.Portugees və metodu yenidən çağırmaq, mətn 3 dəyişir.

İnternetdə bu sadə həll tapmaq mənim üçün çətin idi və mən bunu tapa bilmədi, buna görə bir şey sınamış və tapdım. Bu kömək edir.

16
11 июня '12 в 1:58 2012-06-11 01:58 Cavab Mathijs Van Der Slagt tərəfindən 11 iyun 2012-ci ildə 1:58 2012-06-11 01:58 tarixində verilir

Enum dəyərinin mövcud olmasını təmin etmək və təhlil etmək üçün aşağıdakıları da edə bilərsiniz.

 // Fake Day of Week string strDOWFake = "SuperDay"; // Real Day of Week string strDOWReal = "Friday"; // Will hold which ever is the real DOW. DayOfWeek enmDOW; // See if fake DOW is defined in the DayOfWeek enumeration. if (Enum.IsDefined(typeof(DayOfWeek), strDOWFake)) { // This will never be reached since "SuperDay" // doesn't exist in the DayOfWeek enumeration. enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWFake); } // See if real DOW is defined in the DayOfWeek enumeration. else if (Enum.IsDefined(typeof(DayOfWeek), strDOWReal)) { // This will parse the string into it corresponding DOW enum object. enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWReal); } // Can now use the DOW enum object. Console.Write("Today is " + enmDOW.ToString() + "."); 

Bu kömək edir.

14
22 июля '11 в 23:56 2011-07-22 23:56 Cavab Nathon tərəfindən 22 iyul 'da 23:56' də verildi 2011-07-22 23:56

Bunun bir başqa yolu:

 Console.WriteLine("Name: {0}, Value: {0:D}", Question.Role); 

nəticələnəcəkdir:

 Name: Role, Value: 2 
11
19 сент. Cavab plavozont 19 sep verilir . 2014-09-19 08:42 '14 at 8:42 2014-09-19 08:42

Bəlkə buradan qaçırdım, amma kimsə sadə bir ümumi uzatma üsulunu sınadı. Bu mənim üçün böyük işdir. API-dakı növü bu şəkildə istifadə etməyəcəksiniz, lakin nəticədə bu dəyişiklik tipi əməliyyatına gətirib çıxara bilər. Bu, Roselyn-ə proqramlaşdırma üçün yaxşı bir nümunədir və derivanı GetValue üsulunu sizin üçün etməyə məcbur edir.

  public static void Main() { int test = MyCSharpWrapperMethod(TestEnum.Test1); Debug.Assert(test == 1); } public static int MyCSharpWrapperMethod(TestEnum customFlag) { return MyCPlusPlusMethod(customFlag.GetValue<int>()); } public static int MyCPlusPlusMethod(int customFlag) { //Pretend you made a PInvoke or COM+ call to C++ method that require an integer return customFlag; } public enum TestEnum { Test1 = 1, Test2 = 2, Test3 = 3 } } public static class EnumExtensions { public static T GetValue<T>(this Enum enumeration) { T result = default(T); try { result = (T)Convert.ChangeType(enumeration, typeof(T)); } catch (Exception ex) { Debug.Assert(false); Debug.WriteLine(ex); } return result; } } 
11
27 сент. Cavab Doug Sep 27 tərəfindən verilir 2014-09-27 04:30 '14 'də 4:30' da 2014-09-27 04:30 'da
 public enum QuestionType { Role = 2, ProjectFunding = 3, TotalEmployee = 4, NumberOfServers = 5, TopBusinessConcern = 6 } 

... böyük bir reklamdır.

Nəticəni bu kimi bir int üçün keçirməlisiniz:

 int Question = (int)QuestionType.Role 

Əks halda, tip hələ QuestionType .

Bu ciddilik səviyyəsi C # üsuludur.

Sınıf bəyannaməsini istifadə etmək alternativdir:

 public class QuestionType { public static int Role = 2, public static int ProjectFunding = 3, public static int TotalEmployee = 4, public static int NumberOfServers = 5, public static int TopBusinessConcern = 6 } 

Bəyan etmək daha az zərifdir, ancaq kodda bunu belirtmeniz lazım deyil:

 int Question = QuestionType.Role 

Alternativ olaraq, bir çox sahələrdə bu cür gözləntiləri təmin edən Visual Basic ilə daha rahat hiss edə bilərsiniz.

10
31 марта '14 в 19:35 2014-03-31 19:35 Cavab 31 Mart 'da saat 19: 35' da Knickerless-Noggins tərəfindən verilmişdir 2014-03-31 19:35
 int number = Question.Role.GetHashCode(); 

number 2 olmalıdır.

9
19 сент. Cavab JaimeArmenta tərəfindən verilir Sentyabr 19 2014-09-19 01:53 '14 da 1:53 2014-09-19 01:53

Bunu genişləndirmə üsulunu xüsusi hesablama tipinə yerləşdirərək edə bilərsiniz:

 public static class MyExtensions { public static int getNumberValue(this Question questionThis) { return (int)questionThis; } } 

Bu, mövcud enum dəyərinin int dəyərini asanlaşdırır:

 Question question = Question.Role; int value = question.getNumberValue(); 

və ya

 int value = Question.Role.getNumberValue(); 
9
10 дек. Cavab Bronek tərəfindən verilir 10 dekabr. 2012-12-10 01:09 '12 at 1:09 2012-12-10 01:09

Necə uzadılması üsulu haqqında:

 public static class ExtensionMethods { public static int IntValue(this Enum argEnum) { return Convert.ToInt32(argEnum); } } 

Və istifadəsi bir az gözəldir:

 var intValue = Question.Role.IntValue(); 
6
21 апр. Cavab SixOThree Apr 21 2014-04-21 05:51 '14 da 5:51 2014-04-21 05:51

Aşağıda məsləhət ü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; } 
3
16 дек. Cavan Kamran Şahid 16 dekabrda verilir. 2016-12-16 09:58 '16 saat 09:58 'da 2016-12-16 09:58

İnt və ya daha kiçik məlumatlar ilə fav hack:

 GetHashCode(); 

Siyahı üçün

 public enum Test { Min = Int32.MinValue, One = 1, Max = Int32.MaxValue, } 

budur

 var values = Enum.GetValues(typeof(Test)); foreach (var val in values) { Console.WriteLine(val.GetHashCode()); Console.WriteLine(((int)val)); Console.WriteLine(val); } 

çıxışlar

 one 1 1 max 2147483647 2147483647 min -2147483648 -2147483648 

Disclaimer: Uzun müddətli köçürmələr üçün işləmir

3
26 июня '15 в 19:51 2015-06-26 19:51 Cavab Erik Karlsson tərəfindən verilir. 26 iyun '15 saat 19:51 'da, 2015-06-26 19:51

Enums bir neçə ibtidai növ ilə elan edildiyindən, ümumi genişləndirmə üsulu hər hansı bir növ sayım yaratmaq üçün faydalı ola bilər.

 enum Box { HEIGHT, WIDTH, DEPTH } public static void UseEnum() { int height = Box.HEIGHT.GetEnumValue<int>(); int width = Box.WIDTH.GetEnumValue<int>(); int depth = Box.DEPTH.GetEnumValue<int>(); } public static T GetEnumValue<T>(this object e) => (T)e; 
2
06 дек. Jeffrey Ferreiras tərəfindən verilmiş cavab 06 dekabr 2017-12-06 08:14 '17 'də 8:14' də 2017-12-06 08:14 'də
 public enum Suit : int { Spades = 0, Hearts = 1, Clubs = 2, Diamonds = 3 } Console.WriteLine((int)(Suit)Enum.Parse(typeof(Suit), "Clubs")); //from int Console.WriteLine((Suit)1); //From number you can also Console.WriteLine((Suit)Enum.ToObject(typeof(Suit), 1)); if (typeof(Suit).IsEnumDefined("Spades")) { var res = (int)(Suit)Enum.Parse(typeof(Suit), "Spades"); Console.Out.WriteLine("{0}", res); } 
2
27 июля '18 в 9:29 2018-07-27 09:29 Cavab Gauravsa tərəfindən 27 İyulda '18 'də 9:29 2018-07-27 09:29' də verilir

Nümunədə mən "sayımdan" int "qiymətini almaq" təklif edərdim "

 public enum Sample {Book =1, Pen=2, Pencil =3} int answer = (int)Sample.Book; 

İndi cavab 1 olacaq.

İnşallah kimsə bu kömək edə bilər.

2
03 авг. cavab Vivek 03 avqustda verilir . 2015-08-03 10:12 '15 'də saat 10:12 ' da

Düşündüyüm ən asan həll Get(int) metodunu aşağıdakı kimi yükləməkdir:

 [modifiers] Questions Get(Question q) { return Get((int)q); } 

burada [modifiers] , Get(int) metodu ilə eyni ola bilər. Questions sinifini redaktə edə bilmirsinizsə və ya nədənsə istəmirsinizsə, uzantıyı yazaraq üsulu çox yükləyə bilərsiniz:

 public static class Extensions { public static Questions Get(this Questions qs, Question q) { return qs.Get((int)q); } } 
1
28 янв. cavab Jan 27-də Grx70 tərəfindən verilmişdir 2013-01-28 16:52 '13 'da 16:52 2013-01-28 16:52

İnamın int üçün konvertasiya əvəzinə cəhd edin:

 public static class ReturnType { public static readonly int Success = 1; public static readonly int Duplicate = 2; public static readonly int Error = -1; } 
1
14 янв. Cavab 14 yanvarda Nalan Madesswaran tərəfindən verilir . 2014-01-14 23:28 '14 saat 23:28 2014-01-14 23:28

Vb. Bu olmalıdır

 Public Enum Question Role = 2 ProjectFunding = 3 TotalEmployee = 4 NumberOfServers = 5 TopBusinessConcern = 6 End Enum Private value As Integer = CInt(Question.Role) 
1
12 апр. cavab VPP tərəfindən 12 apreldə verilir 2016-04-12 10:09 '16 at 10:09 2016-04-12 10:09

Aşağıdakıları cəhd edin:

 int value = YourEnum.ToString("D"); 
-14
10 янв. Caryn tərəfindən verilmiş cavab Jan 10 2013-01-10 10:37 '13 saat 10:37 'da 2013-01-10 10:37

haqqında digər suallar və ya bir sual