2011-09-26 67 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}); 

它为我的作品!

相关问题