Nömrəni necə siyahıya salmaq olar?

Necə C # enum yaza bilərsiniz?

məsələn. Aşağıdakı kod tərtib edilmir:

19 сент. Ian Boyd tərəfindən 19 Sentyabrda təyin olundu 2008-09-19 23:34 '08 at 11:34 pm 2008-09-19 23:34
@ 26 cavab
 foreach (Suit suit in Enum.GetValues(typeof(Suit))) { // ... } 
3586
19 сент. Cavab 19 oktyabrda verilir . 2008-09-19 23:37 '08 at 11:37 pm 2008-09-19 23:37

Mənə elə gəlir ki, həqiqətən, dəyərlər deyil, hər bir sayının adlarını yazmaq istəyirsən. Bu halda, Enum.GetNames() düzgün yanaşma kimi görünür.

 public enum Suits { Spades, Hearts, Clubs, Diamonds, NumSuits } public void PrintAllSuits() { foreach (string name in Enum.GetNames(typeof(Suits))) { System.Console.WriteLine(name); } } 

Yeri gəlmişkən, bir dəyəri artırmaq enum dəyərlərini göstərmək üçün yaxşı bir yoldur. Bunun yerinə bunu etməlisiniz.

border=0

Bunun əvəzinə, Enum.GetValues(typeof(Suit)) istifadə Enum.GetValues(typeof(Suit)) .

 public enum Suits { Spades, Hearts, Clubs, Diamonds, NumSuits } public void PrintAllSuits() { foreach (var suit in Enum.GetValues(typeof(Suits))) { System.Console.WriteLine(suit.ToString()); } } 
510
19 сент. Cavab sentyabrın 19-da verildi 2008-09-19 23:39 '08 at 11:39 2008-09-19 23:39

Hesabımın sadə istifadəsi üçün bir neçə uzantı qurdum, bəlkə kimsə onu istifadə edə bilər ...

 public static class EnumExtensions { /// <summary> /// Gets all items for an enum value. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value">The value.</param> /// <returns></returns> public static IEnumerable<T> GetAllItems<T>(this Enum value) { foreach (object item in Enum.GetValues(typeof(T))) { yield return (T)item; } } /// <summary> /// Gets all items for an enum type. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value">The value.</param> /// <returns></returns> public static IEnumerable<T> GetAllItems<T>() where T : struct { foreach (object item in Enum.GetValues(typeof(T))) { yield return (T)item; } } /// <summary> /// Gets all combined items from an enum value. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value">The value.</param> /// <returns></returns> /// <example> /// Displays ValueA and ValueB. /// <code> /// EnumExample dummy = EnumExample.Combi; /// foreach (var item in dummy.GetAllSelectedItems<EnumExample>()) /// { /// Console.WriteLine(item); /// } /// </code> /// </example> public static IEnumerable<T> GetAllSelectedItems<T>(this Enum value) { int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture); foreach (object item in Enum.GetValues(typeof(T))) { int itemAsInt = Convert.ToInt32(item, CultureInfo.InvariantCulture); if (itemAsInt == (valueAsInt  itemAsInt)) { yield return (T)item; } } } /// <summary> /// Determines whether the enum value contains a specific value. /// </summary> /// <param name="value">The value.</param> /// <param name="request">The request.</param> /// <returns> /// <c>true</c> if value contains the specified value; otherwise, <c>false</c>. /// </returns> /// <example> /// <code> /// EnumExample dummy = EnumExample.Combi; /// if (dummy.Contains<EnumExample>(EnumExample.ValueA)) /// { /// Console.WriteLine("dummy contains EnumExample.ValueA"); /// } /// </code> /// </example> public static bool Contains<T>(this Enum value, T request) { int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture); int requestAsInt = Convert.ToInt32(request, CultureInfo.InvariantCulture); if (requestAsInt == (valueAsInt  requestAsInt)) { return true; } return false; } } 

Qiymətləndirmə özü FlagsAttribute ilə bəzədilməlidir

 [Flags] public enum EnumExample { ValueA = 1, ValueB = 2, ValueC = 4, ValueD = 8, Combi = ValueA | ValueB } 
263
03 июня '09 в 15:03 2009-06-03 15:03 cavab iyun 03, '09 saat 15:03 'da verilir 2009-06-03 15:03

.NET platformasının bəzi versiyaları Enum.GetValues dəstəkləmir. Burada Idea 2.0'dan yaxşı bir həll var : Enum.GetValues, Kompakt Çərçivə :

 public List<Enum> GetValues(Enum enumeration) { List<Enum> enumerations = new List<Enum>(); foreach (FieldInfo fieldInfo in enumeration.GetType().GetFields( BindingFlags.Static | BindingFlags.Public)) { enumerations.Add((Enum)fieldInfo.GetValue(enumeration)); } return enumerations; } 

Yansıtma ehtiva edən hər hansı bir kod kimi, yalnız bir dəfə işlədilməsini təmin etmək üçün addımlar atmalı və nəticələr önbelleğe alınmalıdır.

137
03 сент. Cavab Ekevoo tərəfindən verilir. 2009-09-03 21:48 '09 09:48 PM 2009-09-03 21:48

GetValues() hər bir loop GetValues() deyil, çünki bu, digər təkliflərdən daha səmərəli hesab edirəm. Bu da daha qəribədir. Suit enum deyilsə, bir zaman-zaman istisna deyil, kompilyasiya dəfə səhv alırsınız.

 EnumLoop<Suit>.ForEach((suit) => { DoSomethingWith(suit); }); 

EnumLoop bu tamamilə ümumi EnumLoop malikdir:

 class EnumLoop<Key> where Key : struct, IConvertible { static readonly Key[] arr = (Key[])Enum.GetValues(typeof(Key)); static internal void ForEach(Action<Key> act) { for (int i = 0; i < arr.Length; i++) { act(arr[i]); } } } 
79
02 февр. Cavab James tərəfindən 02 fevral. 2012-02-02 16:36 '12 at 4:36 pm 2012-02-02 16:36

Niyə Cast<T> ?

 var suits = Enum.GetValues(typeof(Suit)).Cast<Suit>(); 

IEnumerable<Suit> gedin.

66
17 марта '13 в 7:15 2013-03-17 07:15 cavab 17 aprel '13, saat 07:15 'da sircodealot tərəfindən verilmişdir 2013-03-17 07:15

Silverlight'da Enum.GetValues() .

Orijinal mesajı Einar Ingebrigtsen-dən göndərmək :

 public class EnumHelper { public static T[] GetValues<T>() { Type enumType = typeof(T); if (!enumType.IsEnum) { throw new ArgumentException("Type '" + enumType.Name + "' is not an enum"); } List<T> values = new List<T>(); var fields = from field in enumType.GetFields() where field.IsLiteral select field; foreach (FieldInfo field in fields) { object value = field.GetValue(enumType); values.Add((T)value); } return values.ToArray(); } public static object[] GetValues(Type enumType) { if (!enumType.IsEnum) { throw new ArgumentException("Type '" + enumType.Name + "' is not an enum"); } List<object> values = new List<object>(); var fields = from field in enumType.GetFields() where field.IsLiteral select field; foreach (FieldInfo field in fields) { object value = field.GetValue(enumType); values.Add(value); } return values.ToArray(); } } 
64
17 нояб. Cavab Aubrey Taylor tərəfindən 17 noyabrda verilir. 2010-11-17 04:29 '10 at 4:29 2010-11-17 04:29

Kompakt bir strukturda (3.5) işləyən və kompilyasiya müddətində tip yoxlanışını dəstəkləyən həllimi əlavə edin :

 public static List<T> GetEnumValues<T>() where T : new() { T valueType = new T(); return typeof(T).GetFields() .Select(fieldInfo => (T)fieldInfo.GetValue(valueType)) .Distinct() .ToList(); } public static List<String> GetEnumNames<T>() { return typeof (T).GetFields() .Select(info => info.Name) .Distinct() .ToList(); } 

- Birisi T valueType = new T() xilas T valueType = new T() , mən həllini görməkdən xoşbəxt olar.

Zəng aşağıdakı kimi olacaq:

 List<MyEnum> result = Utils.GetEnumValues<MyEnum>(); 
49
07 июля '10 в 16:37 2010-07-07 16:37 Cavab Mallox 07.07.10 tarixində 4:37 da verildi 2010-07-07 16:37

Hesab edirəm ki, istifadə edə bilərsiniz

 Enum.GetNames(Suit) 
43
19 сент. Cavab Tom Carr Sep 19 2008-09-19 23:37 '08 at 11:37 pm 2008-09-19 23:37
 public void PrintAllSuits() { foreach(string suit in Enum.GetNames(typeof(Suits))) { Console.WriteLine(suit); } } 
42
20 сент. 20 Sentyabrda Joshua Drake tərəfindən verilmiş cavab 2008-09-20 00:05 '08 də 0:05 2008-09-20 00:05
 foreach (Suit suit in Enum.GetValues(typeof(Suit))) { } 

Mən bu qədər əhəmiyyətli deyildim ki, bu, çox yavaşdır. Hər kəs bilirmi? - Orion Edwards 15 oktyabr 2008-ci il saat 01:31 da 7

Hesab edirəm ki, bir serialın yığılması əhəmiyyətli dərəcədə sürətləndirəcəkdir. Göründüyü kimi hər dəfə yeni bir sıra (əks etdirmək). Çox güman ki:

 Array enums = Enum.GetValues(typeof(Suit)); foreach (Suit suitEnum in enums) { DoSomething(suitEnum); } 

Ən azı bir az daha sürətli mı?

31
16 нояб. Cavab 16 noyabr məhdud Xilasetmədə verilir . 2009-11-16 20:19 '09 da 20:19 'da 2009-11-16 20:19

Cəhənnəm nədir, mən birləşdirdiyim ən yüksək cavabları, bir çox sadə uzantıyı birləşdirərək mənim iki pərəstişmdən imtina edəcəyəm

 public static class EnumExtensions { /// <summary> /// Gets all items for an enum value. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value">The value.</param> /// <returns></returns> public static IEnumerable<T> GetAllItems<T>(this Enum value) { return (T[])Enum.GetValues(typeof (T)); } } 

@ Jeppe-Stig-Nielsen tərəfindən sadə və tez şərh edin.

20
15 июня '13 в 11:22 2013-06-15 11:22 Cavab Darkside tərəfindən verilir 15 iyun 'da 11:22 2013-06-15 11:22

ToString () funksiyasını istifadə edirəm, sonra da bayraqlarda baş verən nizamları ayırın və ayrıştırın.

 [Flags] public enum ABC { a = 1, b = 2, c = 4 }; public IEnumerable<ABC> Getselected (ABC flags) { var values = flags.ToString().Split(','); var enums = values.Select(x => (ABC)Enum.Parse(typeof(ABC), x.Trim())); return enums; } ABC temp= ABC.a | ABC.b; var list = getSelected (temp); foreach (var item in list) { Console.WriteLine(item.ToString() + " ID=" + (int)item); } 
19
26 июля '12 в 12:22 2012-07-26 12:22 cavab 26 iyul 12: 12-də Mickey Perlstein tərəfindən verilir. 2012-07-26 12:22

Üç yol:

 1. Enum.GetValues(type) //since .NET 1.1, not in silverlight or compact framewok 2. type.GetEnumValues() //only on .NET 4 and above 3. type.GetFields().Where(x => x.IsLiteral).Select(x => x.GetValue(null)) //works everywhere 

GetEnumValues niyə bir GetEnumValues təqdim olunduğunu bilmirəm, mənim üçün tamamilə GetEnumValues .


Enum<T> kimi bir köməkçi sinifə sahib olmaq mənim üçün ən oxunan və yaddaqalandır:

 public static class Enum<T> where T : struct, IComparable, IFormattable, IConvertible { public static IEnumerable<T> GetValues() { return (T[])Enum.GetValues(typeof(T)); } public static IEnumerable<string> GetNames() { return Enum.GetNames(typeof(T)); } } 

İndi zəng edirsiniz:

 Enum<Suit>.GetValues(); //or Enum.GetValues(typeof(Suit)); //pretty consistent style 

Performans məsələsində də önbellek istifadə edə bilərsiniz, amma bunun heç bir problem olmayacağını düşünmürəm

 public static class Enum<T> where T : struct, IComparable, IFormattable, IConvertible { //lazily loaded static T[] values; static string[] names; public static IEnumerable<T> GetValues() { return values ?? (values = (T[])Enum.GetValues(typeof(T))); } public static IEnumerable<string> GetNames() { return names ?? (names = Enum.GetNames(typeof(T))); } } 
19
12 авг. cavab nawfal 12 aug verilir . 2013-08-12 18:36 '13 saat 18:36 'də 2013-08-12 18:36

Enum təkrarlamaq üçün iki yol var:

 1. var values = Enum.GetValues(typeof(myenum)) 2. var values = Enum.GetNames(typeof(myenum)) 

Birincisi sizə bir object array şəklində dəyərləri verəcəkdir, ikincisi sizə dəyərləri bir array String şəklində verir.

Aşağıda göstərildiyi kimi foreach istifadə edin:

 foreach(var value in values) { //Do operations here } 
16
22 янв. Cavab Kylo Ren Jan 22 verilir 2016-01-22 21:50 '16 saat 21:50 'da 2016-01-22 21:50

Mən bunun daha yaxşı və ya hətta daha yaxşı olduğunu düşünürəm, yalnız bir daha həll olduğunu bildirirəm.

Numaralandırılmış aralığın dəyərləri 0-dan n-1-ə qədər olduqda, ümumi alternativ aşağıdakılardır:

 public void EnumerateEnum<T>() { int length = Enum.GetValues(typeof(T)).Length; for (var i = 0; i < length; i++) { var @enum = (T)(object)i; } } 

Nömrələnmə dəyərləri bitişik olarsa və saymanın ilk və son elementini təmin edə bilərsinizsə, onda:

 public void EnumerateEnum() { for (var i = Suit.Spade; i <= Suit.Diamond; i++) { var @enum = i; } } 

lakin bu ciddi bir siyahı deyil, yalnız bir loop deyil. İkinci üsul başqa baxımdan daha sürətli olsa da ...

13
25 янв. Cavab yanvarın 25-də verilir 2013-01-25 03:05 '13, 3:05 2013-01-25 03:05

Qurma və işləmə zamanı sürəti və növü yoxlamaq istəyirsinizsə, bu köməkçi metod hər element yaratmaq üçün LINQ istifadə etmədən daha yaxşıdır:

 public static T[] GetEnumValues<T>() where T : struct, IComparable, IFormattable, IConvertible { if (typeof(T).BaseType != typeof(Enum)) { throw new ArgumentException(string.Format("{0} is not of type System.Enum", typeof(T))); } return Enum.GetValues(typeof(T)) as T[]; } 

Aşağıdakı kimi istifadə edə bilərsiniz:

 static readonly YourEnum[] _values = GetEnumValues<YourEnum>(); 

Əlbəttə, bir IEnumerable<T> qayıda bilər, lakin burada heç bir şey satın IEnumerable<T> .

13
15 нояб. Cavab dmihailescu verilir 15 noyabr. 2013-11-15 23:13 '13 at 23:13 2013-11-15 23:13

DDL üçün seçim variantları yaratmaq üçün işləyən bir nümunə

 var resman = ViewModelResources.TimeFrame.ResourceManager; ViewBag.TimeFrames = from MapOverlayTimeFrames timeFrame in Enum.GetValues(typeof(MapOverlayTimeFrames)) select new SelectListItem { Value = timeFrame.ToString(), Text = resman.GetString(timeFrame.ToString()) ?? timeFrame.ToString() }; 
11
26 окт. Cavab verildi 26 oktyabr 2012-10-26 00:20 '12 at 0:20 2012-10-26 00:20
 foreach (Suit suit in Enum.GetValues(typeof(Suit))) { } 

(Hal-hazırda qəbul edilən cavabda mən düşünmürəm bir döküm var (mən səhv ola bilərəmsə də).

8
20 янв. Mat yanmasına cavab verdi 2014-01-20 13:37 '14 da 13:37 2014-01-20 13:37

Bu sual 10-cu fəsildə " C # Step by Step 2013 " -də görünür

Müəllif bir cüt sayıcı vasitəsilə (kartların tam göyərtəsi yaratmaq) təkrarlamaq üçün ikiqat for-loopdan istifadə edir:

 class Pack { public const int NumSuits = 4; public const int CardsPerSuit = 13; private PlayingCard[,] cardPack; public Pack() { this.cardPack = new PlayingCard[NumSuits, CardsPerSuit]; for (Suit suit = Suit.Clubs; suit <= Suit.Spades; suit++) { for (Value value = Value.Two; value <= Value.Ace; value++) { cardPack[(int)suit, (int)value] = new PlayingCard(suit, value); } } } } 

Bu halda, SuitValue hər iki ədəddir:

 enum Suit { Clubs, Diamonds, Hearts, Spades } enum Value { Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace} 

PlayingCard müəyyən bir SuitPlayingCard bir kart obyektidir:

 class PlayingCard { private readonly Suit suit; private readonly Value value; public PlayingCard(Suit s, Value v) { this.suit = s; this.value = v; } } 
8
28 июня '15 в 9:12 2015-06-28 09:12 Cavab Ross Qatih tərəfindən 28 İyun 2015 günü 9:12 2015-06-28 09:12 tarixində verilir

Bilmirəm ki, bu, bir az mürəkkəbdir, amma bir xəttli olanları sevirsinizsə, onlardan biri belədir:

 ((Suit[])Enum.GetValues(typeof(Suit))).ToList().ForEach(i => DoSomething(i)); 
7
08 апр. cavab anar khalilov 08 apr. 2014-04-08 18:44 '14 at 18:44 2014-04-08 18:44

Nöqtəni birlə əlaqələndirə bilən bir şeyə çevirmək üçün sadə və ümumi bir yoldur:

 public static Dictionary<int, string> ToList<T>() where T : struct { return ((IEnumerable<T>)Enum .GetValues(typeof(T))) .ToDictionary( item => Convert.ToInt32(item), item => item.ToString()); } 

Və sonra:

 var enums = EnumHelper.ToList<MyEnum>(); 
7
12 сент. Qabriel tərəfindən verilmiş cavab 12 sentyabr 2014-09-12 21:06 '14 at 21:06 2014-09-12 21:06

enum növü enum olacağını enum , lakin hansı növün tam tərtib olunduğunu bilmirsiniz?

 public class EnumHelper { public static IEnumerable<T> GetValues<T>() { return Enum.GetValues(typeof(T)).Cast<T>(); } public static IEnumerable getListOfEnum(Type type) { MethodInfo getValuesMethod = typeof(EnumHelper).GetMethod("GetValues").MakeGenericMethod(type); return (IEnumerable)getValuesMethod.Invoke(null, null); } } 

getListOfEnum metodu, hər hansı bir ədədi daxil etmək üçün əksini istifadə edir və bütün numaralandırma dəyərlərinin bir IEnumerable qaytarır.

İstifadə edin:

 Type myType = someEnumValue.GetType(); IEnumerable resultEnumerable = getListOfEnum(myType); foreach (var item in resultEnumerable) { Console.WriteLine(String.Format("Item: {0} Value: {1}",item.ToString(),(int)item)); } 
5
01 окт. cavab verildi Slappywag Oct 01 2015-10-01 13:14 '15 'də saat 13:14' da

enum növləri "sayını" sayırlar (bunlar olmadıqları) olan konteynerlər deyil, "bu növün dəyişənləri üçün mümkün dəyərləri göstərməklə müəyyənləşdirildikləri üçün" sayılan tiplər "deyilir.

(Əslində, sayım növlərindən daha az mürəkkəb bir "əsas" tamsayı növü hesab olunur, yəni hər bir ədədi dəyəri bir tamsayı dəyərinə (bu adətən örtülü, lakin əl ilə müəyyən edilə bilər) aiddir. C # belə bir "adlandırılmış" dəyər olmasa da, bu növün tamsayısını enum dəyişəninə yaza bilərsiniz.)

GetNames metodu adın göstərdiyi kimi, nömrələrin adları olan bir sıra dizgiləri almaq üçün istifadə edilə bilər.

0
11 окт. 11 oktyabrda Emily Chen tərəfindən verilmiş cavab 2017-10-11 07:50 '17 də 7:50 2017-10-11 07:50

Ayrıca ictimai statik hesablama üzvlərinə əks etdirməklə birbaşa əlaqə saxlaya bilərsiniz:

 typeof(Suit).GetMembers(BindingFlags.Public | BindingFlags.Static) .ToList().ForEach(x => DoSomething(x.Name)); 
0
10 янв. Cavab 10 yanvar Termininja edir 2017-01-10 02:39 '17 'də 2:39' də 2017-01-10 02:39 'da

public static IEnumerable<T> GetValues<T>() , public static IEnumerable<T> GetValues<T>() metodunu sizin sinifə əlavə edin

 public static IEnumerable<T> GetValues<T>() { return Enum.GetValues(typeof(T)).Cast<T>(); } 

zəng edin və nömrənizi köçürün, indi foreach istifadə edərək foreach

  public static void EnumerateAllSuitsDemoMethod() { // custom method var foos = GetValues<Suit>(); foreach (var foo in foos) { // Do something } } 
0
31 марта '17 в 10:08 2017-03-31 10:08 cavab 31 mart '17 'də 10:08' də 2017-03-31 10:08 'a qədər verilir

haqqında digər suallar və ya soruşun