Как вставить новый элемент в 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--" в начало.

Ответ 1

Вы не можете изменить объект 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); 
}

Ответ 2

Вы не можете изменить 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);
}

Ответ 3

Попробуйте

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