Değerden Enum Dize Adı


407

Böyle bir enum yapı var:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

Veritabanımda numaralandırmalar değere göre başvurulur. Benim sorum, numaralandırma sayı temsilini dize adına nasıl döndürebilirim.

Örneğin 2, sonuç verilmelidir Visible.


25
İnanıyorum, şimdi VS 2015 ile bunu yapmanın daha kolay bir yolu var nameof(EnumDisplayStatus.Visible)Umarım birine yardımcı olur
Gabriel Marius Popescu

Yanıtlar:


542

intArka kısmı basit bir oyuncu kadrosu ile bir numaralandırma üyesine dönüştürebilir ve şunları arayabilirsiniz ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();

13
Güncelleme: yalnızca IFormatProvider kullanan bazı aşırı yüklemeler kullanımdan kaldırılmıştır. ToString () iyi. Bkz groups.google.com/group/DotNetDevelopment/browse_thread/thread/...
AndyM

Durumunda davranış nedir enum Foo { A = 1, B= 1 }?
dbkk

3
@dbkk belgelerinde, numaralandırmalarla ilgili olarak "kodunuzun hangi dizenin döndürüleceği hakkında herhangi bir varsayımda bulunmaması gerektiği" belirtilir. çünkü kesin durum alıntı. bkz. msdn.microsoft.com/tr-tr/library/16c1xs4z.aspx
Paul D'Ambra

4
Güncel bir çözüm: msdn.microsoft.com/tr-tr/library/…
Jack

4
shorter: var stringValue = ((EnumDisplayStatus) değeri) .ToString ()
redwards510

188

Örnek "Visible"almadan bir dize almanız gerekiyorsa EnumDisplayStatusbunu yapabilirsiniz:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);

5
Mandoleen'in cevabı hakkında bir yanlışlık varsa: Enum.GetName bir Enum değil, bir dize döndürür
algreat

Bu yansıma kullanıyor mu veya derleyici sahne arkasında kullanmak için yardımcı bir sözlük oluşturuyor mu?
19'da palswim

155

Bunu dene:

string m = Enum.GetName(typeof(MyEnumClass), value);

@nilco bu cevap iyi, ama ben esas olarak benim enum "Açıklama" özel bir özniteliği olduğu için Kents cevap tercih ediyorum. Sonra açıklama almak için bir numaralandırma uzantısı var - bu kullanıcı için ekranda görüntülemek içindir.
Harag

60

Bunu kullan:

string bob = nameof(EnumDisplayStatus.Visible);

9
C # 6+ olsa gerekli.
Adam K Dean

10
@AZChad bilmek harika bir şey, tabii; ancak değerler bir veritabanından geldiğinden OP'nin senaryosunda gerçekten geçerli değildir (yani: çalışma zamanı, derleme zamanı değil, değerler)
Marc Gravell

22

sadece atabilirsin

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

ah .. kent beni dövdü :)


Şimdi Kent tüm "ilk cevap" temsilcisini alıyor. Güzel bir Kent! : p
Matt Kocaj

12

DB - C #

EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());

DB # C

string dbStatus = ((int)status).ToString();

12

ÇÖZÜM:

int enumValue = 2; // The value for which you want to get string 
string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);

Ayrıca, GetName kullanmak Enum açık döküm daha iyidir .

[Performans Karşılaştırma Kodu]

Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
double sum = 0;
int n = 1000;
Console.WriteLine ("\nGetName method way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = Enum.GetName (typeof (Roles), roleValue);
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
Console.WriteLine ("\nExplicit casting way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = ((Roles)roleValue).ToString ();
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");

[Örnek sonuç]

GetName method way:
Average of 1000 runs using Getname method casting way: 0.000186899999999998
Explicit casting way:
Average of 1000 runs using Explicit casting way: 0.000627900000000002

2
Bu 7 yaşındaki bir cevabın kopyası. Sizinkinin neden orijinalinden daha iyi olduğunu açıklayabilir misiniz?
nvoigt

@nvoigt Çünkü, doğruysam, Enum'daki ToString () API'sı artık kullanılmıyor. [ docs.microsoft.com/tr-tr/dotnet/api/…
Naveen Kumar V

Yani ... en az iki cevap daha önce yayınladığınız kodu sağlıyor. Mandoleen veya algreat'ten ne elde edersiniz?
nvoigt

@nvoigt Açık döküm ile karşılaştırıldığında performansından bahsetmediler. Cevabımı beğenmen için bu yeterli mi? : p Yine de teşekkürler, umarım birine yardım eder. :)
Naveen Kumar V

Bir iletişim problemimiz var gibi görünüyor. Bir mobil cihazda mısınız yoksa yeterince aşağı kaydırmadınız mı? Cevabınızın 7 yıl öncesinden iki tam kopyası var. Yanıtlayanları adlandırdım, bu yüzden bulmak kolay olmalı. En az 7 yıldır burada olmayan cevabınız ne sağlıyor?
nvoigt

9

İfadeyi kullanarak en hızlı, derleme zamanı çözümünameof .

Numaralandırmanın değişmezini döndürür.

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

Not:

  • Bir enum'u tam büyük harfle adlandırmak istemezsiniz, ancak büyük / küçük harf duyarlılığını göstermek için kullanılır nameof.

Bu bir cevap olmalıydı.
LinPy fan

@LinPyfan İyi çalışıyor sevindim! Bu OP tarihine göre nispeten yenidir.
Siem

4

Sadece ihtiyacım var:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"

1
çoğu durumda, bu 10 yıl önceki en büyük cevapla hemen hemen aynıdır; belirleyicinin eklenmesi nüanslıdır"f" ve arayanın istediği olabilir veya olmayabilir (buna bağlıdır: ne istediklerine bağlıdır): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Marc Gravell

Ahah randevusuna dikkat etmedim. Bunun gibi eski çözümü biraz güncellemenin iyi olduğunu düşünüyorum. Bu sayfayı açan son kişi olmayacağım. Ve hassasiyetiniz için teşekkürler! :)
Al3x_M

3

Dize değerini [Ad] almak için:

EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}"; 

Ve enum değerini elde etmek için:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));

Neden sadece .ToString ()? 'facepalm'
MeTitus

3

aşağıda verilen bu kodu kullandım

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()

1

İnt numarasını numaralandırma türüne atmanız yeterlidir:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
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.