2009-10-21 40 views
8

Cách chuyển đổi Enum thành Key, Value Pairs. Tôi đã chuyển đổi nó trong C# 3.0.Chuyển đổi Enums thành các cặp khóa, giá trị

public enum Translation 
    { 
     English, 
     Russian, 
     French, 
     German 
    } 

    string[] trans = Enum.GetNames(typeof(Translation)); 

    var v = trans.Select((value, key) => 
    new { value, key }).ToDictionary(x => x.key + 1, x => x.value); 

Trong C# 1.0 cách để làm như vậy là gì?

Trả lời

5

Trong C# 1 ...

string[] names = Enum.GetNames(typeof(Translation)); 

Hashtable hashTable = new Hashtable(); 
for (int i = 0; i < names.Length; i++) 
{ 
    hashTable[i + 1] = names[i]; 
} 

Bạn có chắc chắn bạn thực sự muốn có một bản đồ từ index tên mặc dù? Nếu bạn chỉ sử dụng các chỉ số nguyên, tại sao không chỉ sử dụng một mảng hoặc một ArrayList?

+0

Thanks.Just tôi đã hoàn thành việc học.Learnig C# .Tôi sẽ làm theo lời khuyên của bạn sir. – user193276

+0

Nếu tôi muốn cải thiện thiết kế của mình (kiểu mã hóa), tôi có thể gửi tác phẩm của mình và hỏi ý kiến ​​hay chỉ một câu hỏi đơn giản được cho phép trong diễn đàn này không? – user193276

+0

Vâng, các câu hỏi và câu trả lời cụ thể là lý tưởng - nhưng các câu hỏi liên quan đến các đoạn mã nhỏ * về thiết kế, độ rõ ràng, v.v. Chỉ cần không gửi hàng ngàn dòng mã trong một câu hỏi :) Nó cũng giúp nếu ví dụ của bạn ngắn và đầy đủ, thay vì chỉ là một phần của một dự án lớn. –

16

Đối với C# 3.0 nếu bạn có một Enum như thế này:

public enum Translation 
{ 
    English = 1, 
    Russian = 2, 
    French = 4, 
    German = 5 
} 

không sử dụng này:

string[] trans = Enum.GetNames(typeof(Translation)); 

var v = trans.Select((value, key) => 
new { value, key }).ToDictionary(x => x.key + 1, x => x.value); 

vì nó sẽ mess lên chìa khóa của bạn (đó là một số nguyên).

Thay vào đó, sử dụng một cái gì đó như thế này:

var dict = new Dictionary<int, string>(); 
foreach (var name in Enum.GetNames(typeof(Translation))) 
{ 
    dict.Add((int)Enum.Parse(typeof(Translation), name), name); 
} 
+0

Được cảnh báo rằng trong ví dụ thứ hai (và tôi đoán lần đầu tiên quá nếu nó không sử dụng chỉ mục) nó không hỗ trợ enums với các giá trị int trùng lặp – Arch

+0

Cảm ơn bạn rất nhiều! Đây thực sự là những gì tôi đang tìm kiếm. Tôi không thể hiểu việc sử dụng Dictionary <> datatype trong dự án thực sự. – Tchaps

-1
var enumType = typeof(Translation); 
var objList = enumValuesList.Select(v => 
{ 
    var i = (Translation)Enum.Parse(enumType, v); 
    return new 
    { 
     Id = (int)i, 
     Value = v 
    }; 
}); 
0

Tôi không đọc những câu hỏi một cách cẩn thận, vì vậy mã của tôi sẽ không làm việc trong C# 1.0 vì nó sử dụng Generics. Sử dụng tốt nhất nó với> = C# 4.0 (> = VS2010)

Để làm cho cuộc sống dễ dàng hơn, tôi đã tạo dịch vụ trợ giúp này.

Việc sử dụng cho các dịch vụ như sau:

// create an instance of the service (or resolve it using DI) 
var svc = new EnumHelperService(); 

// call the MapEnumToDictionary method (replace TestEnum1 with your enum) 
var result = svc.MapEnumToDictionary<TestEnum1>(); 

Mã dịch vụ như sau:

/// <summary> 
/// This service provides helper methods for enums. 
/// </summary> 
public interface IEnumHelperService 
{ 
    /// <summary> 
    /// Maps the enum to dictionary. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <returns></returns> 
    Dictionary<int, string> MapEnumToDictionary<T>(); 
} 

/// <summary> 
/// This service provides helper methods for enums. 
/// </summary> 
/// <seealso cref="Panviva.Status.Probe.Lib.Services.IEnumHelperService" /> 
public class EnumHelperService : IEnumHelperService 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="EnumHelperService"/> class. 
    /// </summary> 
    public EnumHelperService() 
    { 

    } 

    /// <summary> 
    /// Maps the enum to dictionary. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <returns></returns> 
    /// <exception cref="System.ArgumentException">T must be an enumerated type</exception> 
    public Dictionary<int, string> MapEnumToDictionary<T>() 
    { 
     // Ensure T is an enumerator 
     if (!typeof(T).IsEnum) 
     { 
      throw new ArgumentException("T must be an enumerator type."); 
     } 

     // Return Enumertator as a Dictionary 
     return Enum.GetValues(typeof(T)).Cast<T>().ToDictionary(i => (int)Convert.ChangeType(i, i.GetType()), t => t.ToString()); 
    } 
} 
+0

Câu hỏi cụ thể yêu cầu câu trả lời C# 1.0, bạn có sử dụng các tính năng phiên bản 2.0 (generics) và 3.0 ('var') không? –

+0

Tệ của tôi, không thấy điều đó. –

0

vay từ các câu trả lời bằng @jamie

Nơi này vào một tĩnh mở rộng lớp học sau đó làm typeof(Translation).ToValueList<int>();

/// <summary> 
    /// If an enum MyEnum is { a = 3, b = 5, c = 12 } then 
    /// typeof(MyEnum).ToValueList<<int>>() will return [3, 5, 12] 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="enumType"></param> 
    /// <returns>List of values defined for enum constants</returns> 
    public static List<T> ToValueList<T>(this Type enumType) 
    { 
     return Enum.GetNames(enumType) 
      .Select(x => (T)Enum.Parse(enumType, x)) 
      .ToList(); 
    } 
Các vấn đề liên quan