C # enum int int değeri alın


1823

Questions(Çoğul) adında bir sınıfım var . Bu sınıfta buna Questionbenzeyen (tekil) bir numaralandırma vardır .

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

In Questionssınıfında Bir var get(int foo)bir döndüren işlevi Questionsbunun için nesneyi foo. Böyle bir şey yapabilmem için enum tamsayı değerini almak için kolay bir yolu var mı Questions.Get(Question.Role)?


31
: Başka bir yol için dökme int-to-enum-in-c keskin .
nawfal

11
Partiye geç kaldığımı biliyorum, ancak yönteminizi, yöntem içinde döküm get(int foo)yaptığınız gibi tanımlayabileceğiniz gibi tanımlamak yerine get(Question foo), yönteminizi şu şekilde çağırabilirsinizQuestions.Get(Question.Role)
Joe

Yanıtlar:


2352

Numaralandırmayı yapın, örn.

int something = (int) Question.Role;

Yukarıdakiler, bir numaralandırma için varsayılan altta yatan tür olduğu gibi, doğada gördüğünüz enumların büyük çoğunluğu için çalışacaktır int.

Bununla birlikte, cecilphillip'in işaret ettiği gibi , numaralandırmaların altta yatan farklı türleri olabilir. Bir enum bir ilan edilirse uint, longya ulong, enum tipine atılmalıdır; örneğin

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

kullanmalısın

long something = (long)StarsInMilkyWay.Wolf424B;

23
@Harry doğru değil. Numaralandırma yapmadan numaralandırma oluşturabilirsiniz, gerekli değildir. ve sadece özel durumlarda numara atarım, çoğu zaman varsayılan değer olarak bırakırım. ama bunu yapabilir enum Test { Item = 1 }ve 1 == (int)Test.Itemeşit olduğunu görebilirsiniz .
Jaider

33
@Jaider (int)Test.ItemBu oyuncu kadrosu! () açık döküm operatörüdür.
Sinthia V

48
@Sinthia V , döküm olmadan oluşturabileceğinizi söyledi , bu doğru
Paul Ridgway

7
Eğer altta yatan tür enum Questionolmasaydı, intama longbu kadro Roleintegral değerini kesecek !
quaylar

1
EnumA parametresini kabul ettiğinizde, yalnızca elde edebileceğiniz sabit sayıda olası integral değeri olduğunu bilirsiniz. Öte yandan, sadece bir intalırsanız, o zaman intbu kabul edilen değerler dahilinde olup olmadığını doğrulamanız gerekir , böylece kodu karmaşıklaştırır. İmzalarınızı her zaman `` `` public void MyMethod (int x) {// x ile bir şeyler yapın} '' public void MyMethod (Enum x) {this.MyMethod ((int) x); } `` ``
percebus

307

Numaralamalar bir entegre tip olabilir yana ( byte, int, shortve benzeri), enum temel tamamlayıcı değeri elde etmek için daha sağlam bir yolu faydalanmak olacaktır GetTypeCodebağıntılı olarak kullanılması, Convertsınıf:

enum Sides {
    Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;

object val = Convert.ChangeType(side, side.GetTypeCode());
Console.WriteLine(val);

Bu, temel integral türünden bağımsız olarak çalışmalıdır.


32
Bu teknik, T: enum'un (aslında T: struct, IConvertible ama bu farklı bir hikaye) olduğu genel bir türle uğraşırken bana değerini kanıtladı.
aboy021

1
Tarafın onaltılı değerini yazdırmak için bunu nasıl değiştirirsiniz? Bu örnek ondalık değeri gösterir. Sorun vartürü object, yani kutuyu açmanız gerekiyor ve ben istediğimden daha karışık olur.
Mark Lakata

2
Ben size bir örnek değiştirmek gerektiğini düşünüyorum sizin örnekte her zaman olacaktır . object val = Convert...etcvarobject
Mesh

2
@TimAbell Gerçekten söyleyebileceğim, dinamik olarak derlenmiş aspx sayfalarının (.cs dosyalarını canlı sunucuya dağıtmanız gerektiğinde) tamsayıları her bir değere farklı şekilde atadığını tespit ettik. Bu, tek bir makinede serileştirilmiş nesnelerin farklı bir makinede farklı değerlerle serileştirilmesi ve etkili bir şekilde bozulması anlamına geliyordu ( saatlerce karışıklığa neden oluyor ). MS ile yükselttik ve otomatik olarak oluşturulan tamsayıların farklı çerçeve sürümleri arasında oluşturulduğunda aynı olmalarının garanti edilmediğini söylediklerini hatırlıyorum.
NickG

4
@TimAbell Ayrı bir durumda, geliştirici, dizideki diğer tüm değerlerin birer birer çıkmasına neden olan kullanılmayan / kullanılmayan bir Enum değerini sildi. Bu nedenle, kodlama standartlarımız artık kimliklerin her zaman açıkça belirtilmesini gerektirmektedir, aksi takdirde kodu eklemek / silmek veya hatta otomatik olarak biçimlendirmek (örneğin alfabetik olarak sıralama) veri bozulmasına neden olan tüm değerleri değiştirir. Herkese tüm Enum tam sayılarını açıkça belirtmesini şiddetle tavsiye ederim. Harici olarak (veritabanı) saklanan değerlerle ilişkili olmaları durumunda bu çok önemlidir.
NickG

199

Genel sabitleri olan statik bir sınıf olarak 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;
}

Ve sonra bunu olarak tanımlayabilirsiniz ve her zaman onu tanımladığınız Question.Rolebir intveya her şeye göre değerlendirir .


31
Bana kalırsa doğru static readonly intsabitler onların sert değerlere derlenmektedir çünkü. Bkz. Stackoverflow.com/a/755693/492
CAD bloke

96
Bu çözüm aslında güçlü yazılan numaralandırmaların gerçek faydasını sağlamaz. Yalnızca belirli bir yönteme GameState-enum parametresini iletmek istersem, derleyici parametre olarak herhangi bir int değişkeni geçirmeme izin vermemelidir.
thgc

12
@CADBloke tam olarak neden kullanacağınızdır const, static readonlyçünkü her karşılaştırdığınızda static readonlydeğişkenin değerini almak için bir yöntem çağrısı yaptığınız halde, constiki değer türünü doğrudan karşılaştırdığınızda değil.
blockloop

3
@ brettof86 Evet, bir const daha hızlı olurdu, derleme sınırlaması hiçbir zaman sorun olmayacaksa, o zaman hepsi iyidir.
CAD bloke

2
@Zack Bunu çok iyi açıklamıyordum, compilation limitationyani derlediğinizde değerin sabit kodlandığını, bu değerde yapılan herhangi bir değişikliğin onu kullanan tüm derlemelerin yeniden derlenmesi gerektiğini gerektirdiğini açıkladım . Kullanım konusunda sizinle aynı fikirde olmaya meyilliyim çünkü değerlerin değiştirilmesinin geniş kapsamlı sonuçları olacaktır.
CAD bloke

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

İle sonuçlanır value == 2.


34
Geçici değişken sorusu gereksizdir.
Gishu

1
Yani böyle bir şey Sorular. (Convert.ToInt16 (Question.Applications))
Jim

6
Her iki yönde de atabilirsiniz; İzlenmesi gereken tek şey, numaralandırmaların hiçbir şeyi zorlamamasıdır (numara ile ilgili hiçbir soru olmamasına rağmen numaralandırma değeri 288 olabilir)
Marc Gravell

@jim: Hayır, sadece değeri ver: Questions.Get ((int) Question.Applications);
Guffa

1
@Gishu Şüpheli olduğunu söyleyebilirsin. ;)
Felix D.

79

İlgili bir notta, intdeğeri almak istiyorsanız System.Enum, o zaman eburada verilir :

Enum e = Question.Role;

Kullanabilirsiniz:

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 ikisi çirkin. İlkini tercih ederim.


1
İkincisi ise en hızlısı.
Johan B

1
Minecraft modding'de Mixins kullanmaya alışkın olan biri olarak ikincisi bariz kazanan gibi görünüyor.
Sollace

40

Düşündüğünüzden daha kolay - bir numaralandırma zaten bir int. Sadece hatırlatılması gerekir:

int y = (int)Question.Role;
Console.WriteLine(y); // Prints 2

15
Nitpick: bu numaralandırma zaten bir int. Diğer numaralandırmalar farklı türlerde olabilir - "enum SmallEnum: byte {A, B, C}"
komutunu deneyin

9
Kesinlikle doğru. C # başvuru: "Her numaralandırma türü char dışında herhangi bir tümleşik türü olabilir, altta yatan bir türü vardır."
Michael Petrotta

33

Misal:

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

Ve enum değerini almak için arkadaki kodda:

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

veya

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

Numaralandırmalar 1 artar ve başlangıç ​​değerini ayarlayabilirsiniz. Başlangıç ​​değerini ayarlamazsanız, başlangıçta 0 olarak atanacaktır.


6
Bu gerçekten derleniyor mu?
Peter Mortensen

Raj olan bir şey bir Rahul veya Priyanka olabilir mi? Değerleriniz çakışıyor ve benzersiz olmak için iki katına çıkmalı, örneğin 0, 1, 2, 4, 8 vb.
Timothy Gonzalez

@TimothyGonzalez açıkça değerlerini belirtmezseniz numaralandırmalar sadece 1 sayılır;)
derHugo

Sayısal değerlerin temel 10 veya temel 2 olduğunu varsayarsanız bu @derHugo
Timothy Gonzalez

@TimothyGonzalez iyi varsaymak pek bir şey yok ... Sadece varsayılan olarak sadece saymak da göstermektedir 1içinde intaçıkça aksi tanımlamak hariç
derHugo

28

Yakın zamanda korumalı yapıcılar ve önceden tanımlanmış statik örnekleri (Roelof - C # sağlamak geçerli numaralandırma değerleri - Futureproof yöntemi sayesinde) yerine sınıflarımda numaralandırma kullanmaktan dönüştürdüm .

Bunun ışığında, şimdi bu konuya nasıl yaklaşacağım aşağıdadır (üstü kapalı / dönüşüm dahil int).

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 yaklaşımın avantajı, numaradan alacağınız her şeyi elde etmenizdir, ancak kodunuz artık çok daha esnektir, bu nedenle değerine bağlı olarak farklı eylemler gerçekleştirmeniz gerekiyorsa Question, kendinize mantık koyabilirsiniz Question(yani tercih edilen OO'da) moda) kodunuz boyunca her senaryoyu ele almak için birçok vaka ifadesi koymak yerine.


Not: Cevap C # 6 özelliklerinden yararlanmak için 2018-04-27 güncellendi; yani ifade ifadeleri ve lambda ifade gövdesi tanımları. Orijinal kod için düzeltme geçmişine bakın . Bu, tanımı biraz daha az ayrıntılı hale getirme avantajına sahiptir; bu yanıtın yaklaşımı ile ilgili ana şikayetlerden biri olmuştur.


2
Açık döküm ve onu atlatmak için yazmak zorunda kod arasındaki ticaret kapalı sanırım. Hala çok uzun olmasaydı uygulamayı seviyorum. +1
Lankymart

3
Buna benzer şekilde yapılandırılmış birkaç farklı sınıf türü kullandım. "Daha sonra aptal olmama izin verme" yöntemini izlemeye çalışırken harikalar yaratıyorlar.
James Haug

20

QuestionÖrneğin, bir yöntemde kullanmak için tür olacağını, bir değişken saklanan enum değeri için bir tamsayı almak istiyorsanız, basitçe bu örnekte yazdım bunu yapabilirsiniz:

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();
}

Değişken Geselecteerdolduğu için bu pencere başlığını 4 olarak değiştirir Talen.Nederlands. Bunu değiştirir Talen.Portugeesve yöntemi tekrar çağırırsam, metin 3 olarak değişir.


3
hollanda kodlama. Ah hayatım.
WiseStrawberry

Ne yazık ki, bu yaklaşım daha az kullandığınızda düşük performans sağlar. Bunu bazı kodlarımda denedim ve zaman geçtikçe, uygulamam daha az ve daha az CPU kullanımı ile yavaşladı ve yavaşladı. Bu, iş parçacıklarının bir şey beklediğini ima etti - muhtemelen enum parametresini ToInt32 () için boks nedeniyle bir tür çöp toplama varsayıyorum. Basit bir int.Parse () 'a geçerek, bu kötü performansı tamamen ortadan kaldırabiliyordum ve kod ne kadar uzun sürerse çalışsın performans aynı kaldı.
Greg

16

Bir enum değerinin var olmasını ve sonra ayrıştırılmasını sağlamak için aşağıdakileri de yapabilirsiniz.

// 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's corresponding DOW enum object.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWReal);
}

// Can now use the DOW enum object.
Console.Write("Today is " + enmDOW.ToString() + ".");

14

Belki özledim, ama kimse basit bir genel uzantısı yöntemi denedi?

Bu benim için harika çalışıyor. API'nıza bu türden döküm türünü bu şekilde önleyebilirsiniz, ancak sonuçta bir değişiklik türü işlemi ile sonuçlanır. Bu programlama için iyi bir durumdur Roslyn derleyici sizin için GetValue <T> yöntemi yapmak zorunda.

    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;
    }
}

Muhtemelen (int) customFlag yapmak daha az yazıyor ve aşağı yukarı aynı şeyi yapıyor mu?
Tim Keating

Re "Belki özledim, ama kimse basit bir genel uzantısı yöntemi denedi ?" : SixOThree " Bunun yerine bir uzantı yöntemi kullan " dedi ve Bronek "Bunu, tanımlanmış numaralandırma türünüze bir uzantı yöntemi uygulayarak yapabilirsiniz" dedi .
Peter Mortensen

13

Bunu yapmanın bir yolu daha:

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

Sonuç:

Name: Role, Value: 2

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

... güzel bir deklarasyon.

Sonucu şöyle yapmak zorundasınız:

int Question = (int)QuestionType.Role

Aksi takdirde, tür hala sabittir QuestionType.

Bu katılık düzeyi C # yoludur.

Alternatiflerden biri, sınıf bildirimi kullanmaktır:

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
}

Bildirmek daha az zariftir, ancak kodda yayınlamanıza gerek yoktur:

int Question = QuestionType.Role

Alternatif olarak, birçok alanda bu tür bir beklentiyi karşılayan Visual Basic ile daha rahat hissedebilirsiniz.


11
int number = Question.Role.GetHashCode();

numberdeğeri olmalı 2.


GetHashCode, Enum ortak maskesinden değer almanın bir yoludur
ThanhLD

Bunun için sadece "yasal" olduğu Not bool*, byte, ushort, int, ve uint**. Diğer türler için GetHashCode değeri değiştirir, örneğin bazı bit kaydırmaları ve xors yapar. (* 1/0, ** tabii ki int için). Ama sonuçta, kendi özel kodunuz olmadıkça bunu yapmayın.
AnorZaken

10

Tanımladığınız numaralandırma türüne bir uzantı yöntemi uygulayarak bunu yapabilirsiniz :

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

Bu, geçerli numaralandırma değerinin int değerini almayı kolaylaştırır:

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

veya

int value = Question.Role.getNumberValue();

5
Bronek, yaptığınız şey aslında yazılması daha uzun süren (jenerik olmayan bir btw) uzantı yöntemiyle bilgilendirici olmayan sözdizimini oluşturmaktır. Tetraneutron'un orijinal çözümünden nasıl daha iyi olduğunu göremiyorum. Bunu bir sohbete dönüştürmeyelim, yığın akışı içinde yardım her zaman hoş karşılanır ve buradaki herkes yardım etmek için burada. Lütfen yorumumu yapıcı eleştiri olarak al.
Benjamin Gruenbaum

2
Benjamin, her şeyden önce, neden yorumumu sildin? Kararlarını anlamıyorum - belki topluluk aracılığıyla başka biri benim yorumumla aynı fikirde olabilir.İkinci olarak, çözümüm Tetraneutron'un birini sarar ve doğru ve kolay bir şekilde yazılır çünkü uzatma yöntemi IntelliSense tarafından önerilmektedir.Bu yüzden kararınızın tarafsız ve temsili olmadığını düşünüyorum.Yığın üzerinde birçok benzer cevap görüyorum ve sorun değil.Her zaman çözümümü kullanıyorum ve belki de bazı insanlar gelecekte çözümümü seçecekler ama Bu olumsuz noktalar bulmayı zorlaştırır.Bunların çoğu doğru ve kopya değil.
Bronek

3
@Bronek Bana ping atmazsan cevap verdiğine dair bir işaret almıyorum. Ben yaptım değil ben yeteneğine sahip veya bunu yapmak istemediğiniz yorumu silmek. Muhtemelen bir mod geldi ve sildi - moderatörlerin dikkatini çekmek ve neden ya da daha iyisini sormak için hoş geldiniz - Meta Stack Overflow'da sorun . Benim hakkımda mükemmel bir programlama bakış açısından çözümünüz hakkında bir fikrim var - yorumları başlamak için budur, kişisel almaya gerek yoktur.
Benjamin Gruenbaum

8

Bunun yerine bir uzantı yöntemi kullanın:

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

Ve kullanım biraz daha güzel:

var intValue = Question.Role.IntValue();

7
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 a 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);
}

takım elbise - "10. (kart oyunları) Maça, kupa, elmas veya geleneksel Anglo, Hispanik ve Fransız oyun kartlarının kulüpleri gibi renk ve / veya belirli amblemlerle ayırt edilen bir kart setinin her biri."
Peter Mortensen

Örnek kodun bir açıklaması sırayla olacaktır ( cevabınızı düzenleyerek , burada yorumlarda değil).
Peter Mortensen

sıfır genellikle numaralandırmalarda bilinmeyen / bilinmeyen durum için ayrılır, bu şekilde tanımlanması olağandışıdır
Chad Grant

6

kullanın:

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

Sonuçlanacak value == 2 .

Bu sadece enum bir içine sığarsa doğrudur int.


1
Bu, yalnızca enum bir tamsayı döndürdüğü intgibi elbette uyuyorsa geçerlidir GetHashCode.
RB.

5

Numaralandırmalar birden fazla ilkel türle bildirilebildiğinden, herhangi bir numaralandırma türünü dökmek için genel bir genişletme yöntemi yararlı olabilir.

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;

4

Uzantı yöntemi aşağıdadır

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;
}

4

Int veya daha küçük numaralarla en sevdiğim kesmek:

GetHashCode();

Bir numaralandırma için

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

Bu,

var values = Enum.GetValues(typeof(Test));

foreach (var val in values)
{
    Console.WriteLine(val.GetHashCode());
    Console.WriteLine(((int)val));
    Console.WriteLine(val);
}

çıktılar

one
1
1
max
2147483647
2147483647
min
-2147483648
-2147483648

Yasal Uyarı:

Uzun süre dayanan numaralandırmalar için çalışmaz.


3

Düşünebildiğim en kolay çözüm, Get(int)yöntemi bu şekilde aşırı yüklemektir :

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

burada [modifiers]genellikle yöntemle aynı olabilir Get(int). QuestionsSınıfı düzenleyemiyorsanız veya herhangi bir nedenle istemiyorsanız, bir uzantı yazarak yöntemi aşırı yükleyebilirsiniz:

public static class Extensions
{
    public static Questions Get(this Questions qs, Question q)
    {
        return qs.Get((int)q);
    }
}

3

"Bir numaralandırmadan 'int' değeri almak için" önermek istediğim örnek şudur:

public enum Sample
{
    Book = 1, 
    Pen = 2, 
    Pencil = 3
}

int answer = (int)Sample.Book;

Şimdi cevap 1 olacak.


3

kullanın:

Question question = Question.Role;
int value = Convert.ToInt32(question);

2

Enum'u int'e dönüştürmek yerine bunu deneyin:

public static class ReturnType
{
    public static readonly int Success = 1;
    public static readonly int Duplicate = 2;
    public static readonly int Error = -1;        
}

2

Visual Basic'te şöyle 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)

3
Soru C # içindir.
Ctrl S

2
Başlıkta "C # içindeki numaradan int değerini al" yazıyor .
Peter Mortensen

0

Mevcut dil özelliklerini içeren bu uzatma yöntemini buldum. Dinamik kullanarak, bu genel bir yöntem yapmak ve çağırma basit ve tutarlı tutan türü belirtmek gerekmez:

public static class EnumEx
{
    public static dynamic Value(this Enum e)
    {
        switch (e.GetTypeCode())
        {
            case TypeCode.Byte:
            {
                return (byte) (IConvertible) e;
            }

            case TypeCode.Int16:
            {
                return (short) (IConvertible) e;
            }

            case TypeCode.Int32:
            {
                return (int) (IConvertible) e;
            }

            case TypeCode.Int64:
            {
                return (long) (IConvertible) e;
            }

            case TypeCode.UInt16:
            {
                return (ushort) (IConvertible) e;
            }

            case TypeCode.UInt32:
            {
                return (uint) (IConvertible) e;
            }

            case TypeCode.UInt64:
            {
                return (ulong) (IConvertible) e;
            }

            case TypeCode.SByte:
            {
                return (sbyte) (IConvertible) e;
            }
        }

        return 0;
    }

, sen bir satır Convert.Changetype (e, e.GetTypeCode ()) tüm bunu yapmak ve bir nesne arka, dinamikleri gerek veya bir uzantısı yöntemi alabilir ki lütfen
Çad Grant

Convert'i kullanmaya katılmayacağım. Sadece oyuncu kadrosu kullanmak daha kolay olurdu. Amacım, herhangi bir enum'u, oyuncu kadrosu kullanmadan kendi değerine dönüştürmekti. Bu, ilişkili tüm dökümleri değiştirmek zorunda kalmadan enum tipinin değiştirilmesine izin verir - ancak bu ne zaman olur? Uzantı yöntemi düzgün çalışıyor. Bununla birlikte, dinamik olduğu için, complier check (görünüşte tüm ifade için) yazamadığından, iyi bir çözüm değil - tip kontrolünün gerçekleştiği anlamına gelen bir sorun yaşıyorum. Bence kadrolara geri döneceğim.
Jeff

1
Döküm üzerinde kullanmak demedim, sadece bu kod saçma ve hiçbir şey başarmak, aslında sorunu daha da kötüleştiriyor. Bu çözümü kaldırmanızı tavsiye ederim
Chad Grant
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.