2011-08-09 2 views
10

열거 형에서 드롭 다운 목록을 만듭니다.IEnumerable에 새 항목을 삽입하는 방법

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

여기 내 확장 프로그램입니다.

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); 
    } 

문제는 IEnumerable에 앤서의 항목을 삽입하는 것입니다. 나는 그것을하는 방법을 알아낼 수 없었다. 누군가 "--select--"를 맨 위에 삽입하도록 코드를 수정하십시오.

답변

18

IEnumerable<T> 개체를 수정할 수 없으며 요소를 열거 할 수있는 인터페이스 만 제공합니다. 그러나 .ToList()을 사용하면 IEnumerable<T>List<T>으로 변환 할 수 있습니다.

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

작동 시도해 정말 감사합니다. – qinking126

3

당신은 IEnumerable을 수정할 수 없습니다 : 이것은 당신이 원하는 경우

는 잘 모르겠어요. 이름에서 알 수 있듯이 전달 전용 열거가 허용됩니다.

이것은 ASP.NET MVC 응용 프로그램이라고 보입니다. 올바른 방법은 당신이 달성 드롭 다운이처럼 DropDownFor 도우미의 적절한 오버로드를 사용하는 것입니다에 대한 (기본 값을 삽입)하려고하는 것을 달성하기 :

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

을이 분명히 확장 방법으로 있다고 가정 간단하게 :

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

는, 이것은

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); 
    } 
관련 문제