如何将新项插入IEnumerable

时间:2011-08-09 15:18:00

标签: c# asp.net-mvc drop-down-menu ienumerable

我从Enum创建了一个下拉列表。

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

我遇到的问题是将antoher项插入IEnumerable。我只是想不出怎么做。有人可以修改我的代码,将“--select--”插入到顶部。

3 个答案:

答案 0 :(得分:20)

您不能修改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); 
}

答案 1 :(得分: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);
}

答案 2 :(得分: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 );
  }