web-dev-qa-db-ja.com

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--」を挿入できますか?.

10
qinking126

_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); 
}
_
20
Fox32

IEnumerableを変更することはできません。その名前が示すように、前方のみの列挙トラバーサルが可能です。

とはいえ、これはASP.NETMVCアプリケーションのようです。ドロップダウンで達成しようとしていること(デフォルト値を挿入)を達成する正しい方法は、次のように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);
}
4
Darin Dimitrov

これを試してみてください

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 );
  }
1
Brian Dishaw