Cari string di Enum dan kembalikan Enum

163

Saya memiliki enumerasi:

public enum MyColours
{
    Red,
    Green,
    Blue,
    Yellow,
    Fuchsia,
    Aqua,
    Orange
}

dan saya punya string:

string colour = "Red";

Saya ingin dapat kembali:

MyColours.Red

dari:

public MyColours GetColour(string colour)

Sejauh ini saya punya:

public MyColours GetColours(string colour)
{
    string[] colours = Enum.GetNames(typeof(MyColours));
    int[]    values  = Enum.GetValues(typeof(MyColours));
    int i;
    for(int i = 0; i < colours.Length; i++)
    {
        if(colour.Equals(colours[i], StringComparison.Ordinal)
            break;
    }
    int value = values[i];
    // I know all the information about the matched enumeration
    // but how do i convert this information into returning a
    // MyColour enumeration?
}

Seperti yang Anda lihat, saya agak macet. Apakah ada untuk memilih enumerator berdasarkan nilai. Sesuatu seperti:

MyColour(2) 

akan menghasilkan

MyColour.Green
Matt Clarkson
sumber
4
@nawfal, tidak menemukan itu ketika saya menanyakan ini bertahun-tahun yang lalu. Telah memilih untuk menutup sebagai duplikat.
Matt Clarkson

Jawaban:

381

lihat System.Enum.Parse:


enum Colors {Red, Green, Blue}

// your code:
Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");

JMarsch
sumber
72
Jangan lupa Anda bisa mengabaikan sensitivitas case dengan memasukkan parameter opsional ketiga menjadi "true"
Aerophilic
Persis apa yang saya cari! Bersulang !
Zame
11
@ user1531040 Sebenarnya, ada Enum.TryParse.
DarLom
Perhatikan bahwa enum parsing selalu 'berhasil' jika inputnya numerik; itu hanya mengembalikan nomor yang diuraikan, yang kemudian akan dilemparkan ke tipe enum. Jadi, jika Anda ingin memeriksa apakah beberapa input pengguna adalah enum yang valid atau sesuatu yang lain, Anda harus memeriksa konten numerik terlebih dahulu. Karena mengembalikan enum yang valid tetapi dengan nilai yang mungkin tidak ada sama sekali dalam nama enum yang ditentukan, Anda bisa mendapatkan beberapa masalah yang sangat aneh.
Nyerguds
19

Anda bisa memasukkan int ke enum

(MyColour)2

Ada juga opsi Enum.Parse

(MyColour)Enum.Parse(typeof(MyColour), "Red")
Guvante
sumber
11

Diberikan perubahan terbaru dan terhebat untuk .NET (+ Core) dan C # 7, berikut adalah solusi terbaik:

var ignoreCase = true;
Enum.TryParse("red", ignoreCase , out MyColours colour);

variabel warna dapat digunakan dalam lingkup Enum.TryParse

Roma
sumber
5

Yang Anda butuhkan adalah Enum.Parse .

Bruno Brant
sumber
2

Saya menandai jawaban OregonGhost +1, kemudian saya mencoba menggunakan iterasi dan menyadari bahwa itu tidak tepat karena Enum.GetNames mengembalikan string. Anda ingin Enum.GetValues:

public MyColours GetColours(string colour)
{  
   foreach (MyColours mc in Enum.GetValues(typeof(MyColours))) 
   if (mc.ToString() == surveySystem) 
      return mc;

   return MyColors.Default;
}
Colin
sumber
1

Anda dapat menggunakan Enum.Parseuntuk mendapatkan nilai enum dari nama. Anda bisa mengulangi semua nilai dengan Enum.GetNames, dan Anda bisa langsung memberikan int ke enum untuk mendapatkan nilai enum dari nilai int.

Seperti ini, misalnya:

public MyColours GetColours(string colour)
{
    foreach (MyColours mc in Enum.GetNames(typeof(MyColours))) {
        if (mc.ToString().Contains(colour)) {
            return mc;
        }
    }
    return MyColours.Red; // Default value
}

atau:

public MyColours GetColours(string colour)
{
    return (MyColours)Enum.Parse(typeof(MyColours), colour, true); // true = ignoreCase
}

Yang terakhir akan melempar ArgumentException jika nilainya tidak ditemukan, Anda mungkin ingin menangkapnya di dalam fungsi dan mengembalikan nilai default.

OregonGhost
sumber
CATATAN: Seharusnya Enum.GetValues, tentu saja, seperti yang ditunjukkan dalam jawaban Colin.
OregonGhost
1
var color =  Enum.Parse<Colors>("Green");
pampi
sumber
Ini bahkan tidak bisa dikompilasi. Tidak ada Parsemetode generik .
João Menighin
Itu dikompilasi & bekerja untuk saya. Mungkin itu tergantung pada versi yang Anda gunakan? Saya menggunakan .NET core 3.1
Vinni
0

Seperti yang disebutkan dalam jawaban sebelumnya, Anda dapat melemparkan langsung ke tipe data yang mendasari (tipe int -> enum) atau parse (string -> tipe enum).

tapi hati-hati - tidak ada .TryParse untuk enum, jadi Anda AKAN membutuhkan blok coba / tangkap di sekitar parse untuk menangkap kegagalan.

Addys
sumber
3
Bukankah sebelum pertanyaan ini ditanyakan, tetapi sekarang ada pada. NET 4! msdn.microsoft.com/en-us/library/system.enum.tryparse.aspx . Itu akan menjadi sesuatu seperti Enum.TryParse <MyColour> ("Merah", out color)
WienerDog
0
class EnumStringToInt // to search for a string in enum
{
    enum Numbers{one,two,hree};
    static void Main()
    {
        Numbers num = Numbers.one; // converting enum to string
        string str = num.ToString();
        //Console.WriteLine(str);
        string str1 = "four";
        string[] getnames = (string[])Enum.GetNames(typeof(Numbers));
        int[] getnum = (int[])Enum.GetValues(typeof(Numbers));
        try
        {
            for (int i = 0; i <= getnum.Length; i++)
            {
                if (str1.Equals(getnames[i]))
                {
                    Numbers num1 = (Numbers)Enum.Parse(typeof(Numbers), str1);
                    Console.WriteLine("string found:{0}", num1);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Value not found!", ex);
        }
    }
}
Raja
sumber
2
C # memiliki fungsionalitas bawaan untuk ini.
Artemix
bagaimana ini jawaban untuk pertanyaan itu? lihat jawaban lain untuk kode yang lebih mudah
Firo
0

Satu hal yang mungkin berguna bagi Anda (selain jawaban yang sudah valid / baik yang diberikan sejauh ini) adalah ide StringEnum yang disediakan di sini

Dengan ini, Anda dapat mendefinisikan enumerasi sebagai kelas (contohnya ada di vb.net):

<StringEnumRegisteredOnly (), DebuggerStepThrough (), ImmutableObject (True)> Publik Tidak Kelas Yang Diwariskan

Private Sub New(ByVal StrValue As String)
  MyBase.New(StrValue)   
End Sub

< Description("Use User Password Authentication")> Public Shared ReadOnly UsernamePassword As New eAuthenticationMethod("UP")   

< Description("Use Windows Authentication")> Public Shared ReadOnly WindowsAuthentication As New eAuthenticationMethod("W")   

Kelas Akhir

Dan sekarang Anda bisa menggunakan kelas ini karena Anda akan menggunakan enum: eAuthenticationMethod.WindowsAuthentication dan ini pada dasarnya seperti menetapkan ' W ' nilai logis WindowsAuthentication (di dalam enum) dan jika Anda melihat nilai ini dari properti jendela (atau sesuatu yang lain yang menggunakan properti System.ComponentModel.Description) Anda akan mendapatkan " Gunakan Windows Authentication ".

Saya telah menggunakan ini untuk waktu yang lama sekarang dan itu membuat kode lebih jelas maksudnya.

Ando
sumber
0
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0
Sandeep Shekhawat
sumber
-1

Anda mungkin juga ingin memeriksa beberapa saran di posting blog ini: Teman kecil baru saya, Enum <T>

Posting ini menjelaskan cara untuk membuat kelas pembantu umum yang sangat sederhana yang memungkinkan Anda untuk menghindari sintaksis jelek yang melekat dengan Enum.Parse- alih-alih Anda akhirnya menulis sesuatu seperti ini dalam kode Anda:

MyColours colour = Enum<MyColours>.Parse(stringValue); 

Atau periksa beberapa komentar di pos yang sama yang berbicara tentang menggunakan metode ekstensi untuk mencapai yang serupa.

Julian Martin
sumber
Tautan pos rusak.
Machado