2011-09-26 72 views
3

我需要一種方法來創建一個IEnumerable的擴展方法,這將允許我返回一個SelectListItem的列表。Lambda擴展方法轉換IEnumerable <T>到列表<SelectListItem>

例如

public class Role 
    { 
     public string Name {get;set;} 
     public string RoleUID {get;set;} 
    } 
    IEnumerable<Role> Roles = .../*Get Roles From Database*/ 
    var selectItemList = Roles.ToSelectItemList(p => p.RoleUID,r => r.Name); 

這會給我的名字是顯示器,以及RoleUID作爲價值SelectItemList。

重要我希望這是通用的,所以我可以使用任何兩個屬性創建一個對象,而不僅僅是一個類型爲Role的對象。

我該怎麼做?

我想象像下面

public static List<SelectItemList> ToSelectItemList<T,V,K>(this IEnumerable<T>,Func<T,V,K> k) 

什麼的,我明明知道是不正確的。

回答

9

爲什麼不結合現有的SelectToList方法?

var selectItemList = Roles 
    .Select(p => new SelectListItem { Value = p.RoleUID, Text = p.Name }) 
    .ToList(); 

如果你想專門把它放到一個方法,那麼你可以定義ToSelectListItem爲這兩種方法的結合。

public static List<SelectListItem> ToSelectListItem<T>(
    this IEnumerable<T> enumerable, 
    Func<T, string> getText, 
    Func<T, string> getValue) { 

    return enumerable 
    .Select(x => new SelectListItem { Text = getText(x), Value = getValue(x) }) 
    .ToList(); 
} 
+0

太容易了!哈哈,謝謝... – TheJediCowboy

+0

值得注意的'TText'&'TValue'會因爲這是'SelectListItem'屬性的東西,所以始終是'string'。 –

+0

@AlastairPitts是的,我剛剛注意到並糾正了它。最初我以爲'SelectListItem'是一個泛型類型,但經過進一步的研究發現它是一個具體的MVC類型。感謝您指出! – JaredPar

1

這樣的事情呢? (注:我沒有測試過這一點,但它應該工作

public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> source, Func<T, string> textPropertySelector, Func<T, string> valuePropertySelector, Func<T, bool> isSelectedSelector) 
    { 
     return source 
      .Select(obj => new SelectListItem 
      { 
       Text = textPropertySelector(obj), 
       Value = valuePropertySelector(obj), 
       Selected = isSelectedSelector(obj) 
      }) 
      .ToList(); 
    } 

,你會使用它就像你的當前,唯一不同的是我添加了另一個選擇設置Selected布爾屬性

0

怎麼樣使用這樣的事情

IEnumerable<SelectListItem> data = Roles.Select(f => new SelectListItem { Value = f.RoleUID, Text = f.Name}); 

它爲我的作品!

相關問題