2011-08-09 13 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); 
    } 
関連する問題