Lambda扩展方法:将IEnumerable<T>转换为List<SelectListItem>

3

我需要一种方法,可以基于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,其中名称为显示内容,RoleUID为值。 重要提示:我希望这是通用的,因此我可以使用任何对象的两个属性创建它,而不仅仅是Role类型的对象。
我该如何做?
我想象中的代码如下:
 public static List<SelectItemList> ToSelectItemList<T,V,K>(this IEnumerable<T>,Func<T,V,K> k)

如果说“或者什么的话”,我显然知道那是不正确的。

3个回答

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

值得注意的是,TTextTValue始终为string,因为这是SelectListItem属性的类型。 - Alastair Pitts
@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});

这对我有效!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接