2011-08-09 12 views
10

Creo una lista desplegable de Enum.Cómo insertar un nuevo elemento en un IEnumerable

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

aquí está mi extensió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 --" }; 


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

el problema que tengo es insertar otro elemento en IEnumerable. Simplemente no pude entender cómo hacerlo. ¿Puede alguien modificar mi código para insertar "--select--" en la parte superior?

Respuesta

18

No puede modificar un objeto IEnumerable<T>, solo proporciona una interfaz para enumerar elementos. Pero podría usar .ToList() para convertir IEnumerable<T> a List<T>.

no estoy seguro si esto es lo que quiere:

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

funciona, muchas gracias. – qinking126

3

No se puede modificar un IEnumerable. Como su nombre lo indica, permite un cruce de enumeración de solo reenvío.

Dicho esto, parece que se trata de una aplicación ASP.NET MVC. La forma correcta para lograr lo que usted está tratando de lograr (insertar un valor por defecto) para un desplegable es utilizar la sobrecarga adecuada del ayudante DropDownFor, así:

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

Obviamente, esto supone que su método de extensión es tan simple como:

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

seguirlo

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