2017-02-01 25 views
0

リストをIEnumerableに変換する方法を示す記事thisが見つかりました。誰かが多くのリストで使用できる汎用関数に変換できるかどうか私に説明できますか?TModelを使用してIEnumerable <SelectListItem>に変換する汎用関数

例えば、私は

public class City 
{ 
    public int CityId { get; set; } 
    public string CityName { get; set; } 
} 
public class State 
{ 
    public int StateId { get; set; } 
    public string StateName { get; set; } 
    public string StateAbbreviation { get; set; } 
} 

それから私は私がドロップダウンを表示するこれらの2つのリスト持っている:

List<City> cities 
List<State> states 

を私は次のように何かをする2種類の方法を設定できますこれをコピーして、このコードを複数のリストに貼り付ける必要があります。これは私が望むものではありません。私は思ったんだけど何

public static IEnumerable<SelectListItem> GetCitiesSelectList() 
{ 
    IEnumerable<SelectListItem> cityList = GetCities().Select(x => new SelectListItem() { Text = x.CityName, Value = x.CityId.ToString() }); 
    return qList; 
} 

は、これに似たものがある場合ですが、リストのいずれかのタイプに渡し、また、リストテキストと値を渡すことができますか?私はあなたがTModelで何かをすることができることを知っていますが、私はそれを完全に理解しておらず、誰かが私を正しい方向に押し込むことを望んでいました。

+0

なぜステート名、CityName?どうして名前だけではないか – Peru

+0

分かりやすくするため、これは単なる例です。 –

+0

私の答えはいくつかのコードスニペットで更新されましたhttp://stackoverflow.com/a/41990164/1481690 – Peru

答えて

0

@ miguelermの回答は固いです。しかし、あなたはプロパティの文字列定数を使用して不快なら、あなたはこの変換のための拡張メソッドを作成することができます。

public static class EnumerableExtensions 
{ 
    public static IEnumerable<SelectListItem> ToSelectList<T>(
     this IEnumerable<T> collection, 
     Func<T, object> textSelector, 
     Func<T, object> valueSelector) 
    { 
     // null checking omitted for brevity 
     foreach (var item in collection) 
     { 
      yield return new SelectListItem() 
      { 
       Text = textSelector(item) as string, 
       Value = valueSelector(item) as string 
      }; 
     } 
    } 
} 

あなたがそうのようなカミソリでそれを使用することができます。

@Html.DropDownListFor(m => m.SelectedCity, Model.Cities.ToSelectList(c => c.CityName, city => c.CityId)) 
+0

@miguelermの回答はしっかりとしていますが、ここで説明したように私は考えていました。 –

+0

なぜ 'string'ではなく' object'ですか?なぜ 'foreach' +' yield 'をLINQの代わりに使うのですか? –

+0

@Danコールの前に明示的に値を文字列に変換する必要を避けるために、 'object'を選択しました。 Razorでもっと明示的であれば、文字列の値を使用するように署名を切り替えることは間違いありません。投影にLINQを使用する必要はなく、そのコードはかなり簡単です。 –

0

モデルを一貫して命名するのが最も簡単な方法です。 { Id , Name}のようなドロップダウン用の別のエンティティがあり、その共通モデルをドロップダウン変換に使用しているとします。 パブリッククラスドロップダウン {かかわらず、あなたがドロップダウンに変換エンティティのドロップダウンを使用して変換を行い、uは何を期待戻るヘルパーメソッドにリストを渡したいどのように多くのリストの項目の

public IEnumerable<int> SelectedItems 
    { 
     get; 
     set; 
    } 


    public IEnumerable<SelectListItem> Items 
    { 
     get; 
     set; 
    } 


    public IEnumerable<string> SelectedItemsString 
    { 
     get; 
     set; 
    } 
} 

!!

IEnumerable<SelectListItem> dropdownItems = new MultiSelectList(YourEntity, "ID", "Name", selectedId); 
      DropDown fboDropDown = new DropDown { Items = dropdownItems, SelectedItems = selectedId }; 

は、だけでなく、マルチ選択リスト

0

ドロップダウンのために使用することができ、基本クラスSelectListItemを作成します。 SelectListのがIEnumerable<SelectListItem>にcasteableある

var cities = new SelectList(cityList, "CityId", "CityName"); 
var states = new SelectList(cityList, "StateId", "StateAbbreviation"); 

:これについて何

public class SelectListItem 
{ 
    public virtual string Text { get; set; } 
    public virtual string Value { get; set; } 
} 

public class City : SelectListItem 
{ 
    public int CityId { get; set; } 
    public string CityName { get; set; } 
    public override string Text 
    { 
     get { return CityName; } 
     set { CityName = value; } 
    } 
    public override string Value 
    { 
     get { return CityId.ToString(); } 
     set { CityId = (int)value; } 
    } 
} 
public class State : SelectListItem 
{ 
    public int StateId { get; set; } 
    public string StateName { get; set; } 
    public string StateAbbreviation { get; set; } 
    public override string Text 
    { 
     get { return StateName; } 
     set { StateName = value; } 
    } 
    public override string Value 
    { 
     get { return StateId.ToString(); } 
     set { StateId = (int)value; } 
    } 
} 
1

あなたが書く一般的な方法は、単にLinqを使うよりも単純ではありませんSelect

var cityList = cities.Select(c => new SelectListItem 
{ 
    Name = c.CityName, 
    Value = c.CityId.ToString() 
}); 

しかし、あなたが実際にそれが一般的なようにしたい場合は、あなたがこれを行うことができます:

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> input, 
    Func<T, string> valueFunc, 
    Func<T, string> nameFunc) 
{ 
    return input.Select(i => new SelectListItem 
    { 
     Value = valueFunc(i), 
     Name = nameFunc(i) 
    }); 
} 

をそして、このように使用します。

var cityList = cities.ToSelectList(c => c.CityId.ToString(), c => c.CityName); 
関連する問題