Tìm kiếm một chuỗi trong Enum và trả lại Enum


163

Tôi có một bảng liệt kê:

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

và tôi có một chuỗi:

string colour = "Red";

Tôi muốn có thể trở lại:

MyColours.Red

từ:

public MyColours GetColour(string colour)

Cho đến nay tôi có:

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

Như bạn thấy, tôi có một chút bế tắc. Có cách nào để chọn một điều tra viên theo giá trị. Cái gì đó như:

MyColour(2) 

sẽ dẫn đến

MyColour.Green


4
@nawfal, đã không tìm thấy điều đó khi tôi hỏi điều này tất cả những năm trước. Đã bình chọn để đóng như là bản sao.
Matt Clarkson

Câu trả lời:


381

kiểm tra System.Enum.Pude:


enum Colors {Red, Green, Blue}

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


72
Đừng quên bạn có thể bỏ qua độ nhạy của trường hợp bằng cách chuyển tham số tùy chọn thứ ba thành "true"
Aerophilic

Chính xác những gì tôi đang tìm kiếm ! Chúc mừng!
Zame

11
@ user15 31040 Trên thực tế, có Enum.TryPude.
DarLom

Lưu ý rằng phân tích enum luôn 'thành công' nếu đầu vào là số; nó chỉ trả về số được phân tích cú pháp, sau đó được chuyển sang kiểu của enum. Vì vậy, nếu bạn muốn kiểm tra xem một số đầu vào của người dùng là enum hợp lệ hay cái gì khác, bạn nên kiểm tra nội dung số trước. Vì nó trả về một enum hợp lệ nhưng với một giá trị hoàn toàn không tồn tại trong các tên enum đã xác định, bạn có thể gặp một số vấn đề thực sự kỳ lạ.
Nyerguds

19

Bạn có thể truyền int cho enum

(MyColour)2

Ngoài ra còn có tùy chọn Enum.Pude

(MyColour)Enum.Parse(typeof(MyColour), "Red")

11

Đưa ra những thay đổi mới nhất và lớn nhất cho .NET (+ Core) và C # 7, đây là giải pháp tốt nhất:

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

biến màu có thể được sử dụng trong phạm vi của Enum.TryPude



2

Tôi đã đánh dấu câu trả lời +1 của OregonGhost, sau đó tôi đã thử sử dụng phép lặp và nhận ra nó không hoàn toàn đúng vì Enum.GetNames trả về chuỗi. Bạn muốn Enum.GetValues:

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

   return MyColors.Default;
}

1

Bạn có thể sử dụng Enum.Parseđể có được một giá trị enum từ tên. Bạn có thể lặp lại tất cả các giá trị vớiEnum.GetNames và bạn chỉ có thể chuyển một int thành enum để lấy giá trị enum từ giá trị int.

Như thế này, ví dụ:

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
}

hoặc là:

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

Cái sau sẽ đưa ra một ArgumentException nếu không tìm thấy giá trị, bạn có thể muốn bắt nó bên trong hàm và trả về giá trị mặc định.


LƯU Ý: Tất nhiên, đó phải là Enum.GetValues, như thể hiện trong câu trả lời của Colin.
OregonGhost

1
var color =  Enum.Parse<Colors>("Green");

Điều này thậm chí không biên dịch. Không có Parsephương pháp chung chung .
João Menighin

Nó biên dịch và làm việc cho tôi. Có lẽ nó phụ thuộc vào phiên bản bạn đang sử dụng? Tôi đang sử dụng .NET core 3.1
Vinni

0

Như đã đề cập trong các câu trả lời trước, bạn có thể truyền trực tiếp vào kiểu dữ liệu cơ bản (kiểu int -> enum) hoặc phân tích cú pháp (chuỗi -> kiểu enum).

nhưng hãy cẩn thận - không có .TryPude cho enums, vì vậy bạn S need cần một khối thử / bắt xung quanh phân tích cú pháp để bắt lỗi.


3
Không phải trước khi câu hỏi này được hỏi, nhưng bây giờ đã có .NET 4! msdn.microsoft.com/en-us/l Library / system.enum.tryparse.aspx . Nó sẽ giống như Enum.TryPude <MyColour> ("Đỏ", hết màu)
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);
        }
    }
}

2
C # có chức năng tích hợp sẵn cho việc này.
Artemix

Làm thế nào đây là một câu trả lời cho câu hỏi? nhìn vào các câu trả lời khác để biết mã dễ dàng hơn nhiều
Firo

0

Một điều có thể hữu ích cho bạn (bên cạnh các câu trả lời hợp lệ / tốt được cung cấp cho đến nay) là ý tưởng StringEnum được cung cấp ở đây

Với điều này, bạn có thể định nghĩa bảng liệt kê của mình dưới dạng các lớp (ví dụ có trong vb.net):

<StringEnumRegisteredOnly (), DebuggerStepThrough (), ImmutableObject (True)> Public NotInheritable Class eAuthenticationMethod Kế thừa StringEnumBase (Của eAuthenticationMethod)

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")   

Lớp cuối

Và bây giờ bạn có thể sử dụng lớp này như bạn sẽ sử dụng một enum: eAuthenticationMethod.WindowsAuthentication và điều này về cơ bản giống như gán ' W ' giá trị logic của WindowsAuthentication (bên trong enum) và nếu bạn xem giá trị này từ một thuộc tính cửa sổ (hoặc một cái gì khác sử dụng thuộc tính System.ComponentModel.Des mô tả) bạn sẽ nhận được " Sử dụng Xác thực Windows ".

Tôi đã sử dụng điều này trong một thời gian dài và nó làm cho mã rõ ràng hơn trong ý định.


0
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0

-1

Bạn cũng có thể muốn xem một số gợi ý trong bài đăng trên blog này: bạn nhỏ mới của tôi, Enum <T>

Bài viết mô tả một cách để tạo một lớp trình trợ giúp chung rất đơn giản cho phép bạn tránh cú pháp truyền xấu xí vốn có với Enum.Parse - thay vào đó bạn sẽ viết một cái gì đó như thế này trong mã của mình:

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

Hoặc xem một số ý kiến ​​trong cùng một bài đăng nói về việc sử dụng phương pháp mở rộng để đạt được tương tự.


Các liên kết bài bị hỏng.
Machado
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.