用于将IEnumerable <T>转换为List <SelectListItem>的Lambda扩展方法

The*_*boy 3 c# linq generics

我需要一种方法来创建一个IEnumerable的扩展方法,这将允许我返回一个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);
Run Code Online (Sandbox Code Playgroud)

这会给我一个SelectItemList,其中Name是显示,RoleUID是值.

重要事项我希望这是通用的,因此我可以使用对象的任何两个属性创建它,而不仅仅是Role类型的对象.

我怎样才能做到这一点?

我想象下面的东西

 public static List<SelectItemList> ToSelectItemList<T,V,K>(this IEnumerable<T>,Func<T,V,K> k)
Run Code Online (Sandbox Code Playgroud)

或者其他什么,我显然知道这是不正确的.

Jar*_*Par 10

为什么不结合现有的SelectToList方法?

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

如果您想将其专门放入一个方法中,那么您可以将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();
}
Run Code Online (Sandbox Code Playgroud)