转换IEnumerable的Lambda扩展方法List< SelectListItem>

本文关键字:方法 SelectListItem List 扩展 IEnumerable 转换 Lambda | 更新日期: 2023-09-27 18:09:58

我需要一种方法来创建一个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);

这将给我一个SelectItemList,其中Name是显示,RoleUID是值。

重要我希望这是通用的,这样我就可以用对象的任意两个属性来创建它,而不仅仅是角色类型的对象。

我该怎么做?

我想象如下

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

之类的,我知道这是不正确的

转换IEnumerable<T>的Lambda扩展方法List< SelectListItem>

为什么不把现有的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();
}

这样怎么样?(注意:我还没有测试过,但它应该可以工作。

    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布尔属性。

这样写怎么样

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

这对我有用!