2011-08-09 28 views
10

Tôi tạo danh sách thả xuống từ Enum.Làm thế nào để chèn mục mới vào IEnumerable

public enum Level 
{ 
    Beginner = 1, 
    Intermediate = 2, 
    Expert = 3 
} 

đây là tiện ích của tôi.

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) 
    { 

     IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>(); 

     var result = from TEnum e in values 
        select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() }; 

     var tempValue = new { ID = 0, Name = "-- Select --" }; 


     return new SelectList(result, "Id", "Name", enumObj); 
    } 

vấn đề tôi có là chèn mục phản đối vào IEnumerable. Tôi chỉ không thể tìm ra cách để làm điều đó. Ai đó có thể vui lòng sửa đổi mã của tôi để chèn "--select--" lên trên cùng.

Trả lời

18

Bạn không thể sửa đổi đối tượng IEnumerable<T>, nó chỉ cung cấp giao diện liệt kê các phần tử. Nhưng bạn có thể sử dụng .ToList() để chuyển đổi IEnumerable<T> thành List<T>.

Tôi không chắc chắn nếu điều này là những gì bạn muốn:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) 
{ 

    IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>(); 

    var result = from TEnum e in values 
       select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() }; 

    var tempValue = new { ID = 0, Name = "-- Select --" }; 

    var list = result.ToList(); // Create mutable list 

    list.Insert(0, tempValue); // Add at beginning of list 

    return new SelectList(list, "Id", "Name", enumObj); 
} 
+0

nó hoạt động, cảm ơn bạn rất nhiều. – qinking126

3

Bạn không thể sửa đổi một IEnumerable. Như tên cho thấy nó cho phép một traversal chỉ chuyển tiếp.

Điều này được cho là có vẻ như đây là ứng dụng ASP.NET MVC. Các cách chính xác để đạt được những gì bạn đang cố gắng để đạt được (chèn một giá trị mặc định) cho một thả xuống là sử dụng quá tải thích hợp của helper DropDownFor, như thế này:

@Html.DropDownListFor(
    x => x.SomeValue, 
    Model.SomeEnum.ToSelectList(), 
    "-- Select --" 
) 

Điều này rõ ràng giả định rằng phương pháp khuyến nông cho bạn một đơn giản như:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) 
{ 
    var result = 
     from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>() 
     select new 
     { 
      Id = (int)Enum.Parse(typeof(TEnum), e.ToString()), 
      Name = e.ToString() 
     }; 
    return new SelectList(result, "Id", "Name", enumObj); 
} 
1

này cung cấp cho một thử

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) 
    { 
    var result = (from TEnum e in Enum.GetValues(typeof(TEnum)) 
        select new 
        { 
         ID = (int) Enum.Parse(typeof(TEnum), e.ToString()), 
         Name = e.ToString() 
        }).ToList(); 

    result.Insert(0, new 
         { 
         ID = 0, 
         Name = "-- Select --" 
         }); 

    return new SelectList(result, "Id", "Name", enumObj); 
    } 
Các vấn đề liên quan