2012-03-07 42 views
5

Nếu tôi có một enum của char củaPhân tích chuỗi để phù hợp với giá trị enum

public enum Action 
{ 
    None, 
    Address = 'A', 
    Amendment = 'C', 
    Normal = 'N' 
} 

cách tốt nhất để phân tích một chuỗi ký tự đơn để phù hợp với enum char tương ứng và phù hợp None nếu không tìm thấy là gì. TryParse khớp với Tên chứ không phải giá trị.

Ví dụ nếu chuỗi Tôi đã là "C" Tôi muốn để có được Action.Amendement

Cảm ơn trước

+2

"Tôi có enum char" - no you don't :) Bạn có enum 'int's, có giá trị được chỉ định bằng ký tự chữ. – porges

+0

@Porges cảm ơn bạn đã làm rõ! – m4rc

Trả lời

5
char c = 'C'; // existent value 
var action = Enum.GetValues(typeof(Action)).Cast<Action>().FirstOrDefault(a => (char)a == c); 
// action = Action.Amendment 

và:

char c = 'X'; // non existent value 
var action = Enum.GetValues(typeof(Action)).Cast<Action>().FirstOrDefault(a => (char)a == c); 
// action = Action.None 
+0

rực rỡ! Điều này hoạt động giống như tôi muốn. :-) Cảm ơn – m4rc

4

Chỉ cần cast nó:

Action f = (Action)'C'; 

Nếu bạn đã có một chuỗi và tích cực là ít nhất 1 ký tự bạn có thể làm:

Action f = (Action)"C"[0]; 
+0

Tôi nghĩ rằng anh ta muốn nhận 'Action.None' với' 'X'', ví dụ vì '' X'' không phải là giá trị hợp lệ cho enum. –

+0

@DarinDimitrov Vâng, tôi nhận thấy điều đó. Đó là lý do tại sao tôi trả lời câu trả lời của bạn –

+0

Đây là điều bạn cần, và "chúng tôi không cần LINQ" để phân tích một enum, chúng tôi đã phân tích các enums từ năm 2003! "Omg, ffs. – b0rg

0

Enums là loại số đằng sau hậu trường. Bạn có thể thử một loại chuỗi công khai:

public class Action() 
{ 
    public const string A = "Address"; 
    public const string C = "Amendment"; 
} 

Nếu bạn muốn thực hiện theo 2 cách thì bạn có thể muốn sử dụng bộ sưu tập từ điển 2 chiều.

3

Cá nhân tôi để nguyên chúng là số nguyên và sử dụng DescriptionAttributes và một lớp tiện ích để có được mô tả attribue cho loại. Sau đó, bạn có thể sử dụng nhiều hơn chỉ là một nhân vật để hiển thị những gì bạn muốn.

Ví dụ về điều này là;

/// <summary> 
    /// Returns the string value defined by the description attribute of the given enum. 
    /// If no description attribute is available, then it returns the string representation of the enum. 
    /// </summary> 
    /// <param name="value">Enum to use</param> 
    /// <returns>String representation of enum using Description attribute where possible</returns> 
    public static string StringValueOf(Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 
     DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 
     if (attributes.Length > 0) 
     { 
      return attributes[0].Description; 
     } 
     else 
     { 
      return value.ToString(); 
     } 
    } 

nơi enum của bạn được định nghĩa là một cái gì đó như;

public enum Action 
{ 
    None, 
    [DescriptionAttribute("A")] 
    Address, 
    [DescriptionAttribute("C")] 
    Amendment, 
    [DescriptionAttribute("N")] 
    Normal 
} 
+0

cảm ơn, tôi không biết về DescriptionAttributes.Điều này đã giúp tôi (với một vấn đề khác nhau nhưng vẫn ...) –

+0

@DanielGruszczyk - Không có probs.Bạn không bị giới hạn trong DescriptionAttributes hoặc. omAttribute] (http://msdn.microsoft.com/en-us/library/84c42s56.aspx) có thể được sử dụng để làm điều này. Chúng tôi sử dụng nó để thực hiện ánh xạ của một giá trị hệ thống đến một giá trị khác (ví dụ: Giá trị enum đại diện cho giá trị cho một hệ thống, và chúng tôi có một số thuộc tính mô tả để ánh xạ tới các hệ thống khác hoặc mô tả tốt hơn hoặc một số thông tin liên quan khác cần ghép nối với giá trị enum). –

Các vấn đề liên quan