C# 用于转换IEnumerable的Lambda扩展方法<;T>;列出<;选择列表项>;
我需要一种方法来创建IEnumerable的扩展方法,该方法允许我返回SelectListItem的列表 比如说C# 用于转换IEnumerable的Lambda扩展方法<;T>;列出<;选择列表项>;,c#,linq,generics,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 selec
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);
公共类角色
{
公共字符串名称{get;set;}
公共字符串RoleUID{get;set;}
}
IEnumerable角色=…/*从数据库获取角色*/
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)
公共静态列表到selectItemList(此IEnumerable,Func k)
或者,我显然知道这是不正确的。为什么不把现有的
Select
和ToList
方法结合起来呢
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();
}
公共静态列表到SelectListItem(
这个IEnumerable可枚举,
Func getText,
Func(获取值){
返回可枚举
.Select(x=>newselectListItem{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();
}
public static List to selectItemList(此IEnumerable源、Func textPropertySelector、Func valuePropertySelector、Func isSelectedSelector)
{
返回源
.选择(obj=>new SelectListItem
{
Text=文本属性选择器(obj),
值=值属性选择器(obj),
选定=isSelectedSelector(obj)
})
.ToList();
}
您可以像当前一样使用它,唯一的区别是我添加了另一个选择器来设置
Selected
boolean属性。这样使用怎么样
IEnumerable<SelectListItem> data = Roles.Select(f => new SelectListItem { Value = f.RoleUID, Text = f.Name});
IEnumerable data=Roles.Select(f=>newselectListItem{Value=f.RoleUID,Text=f.Name});
它适合我!值得注意的是,
TText
和TValue
总是string
,因为这就是SelectListItem
属性。@AlastairPitts是的,我刚刚注意到并更正了它。最初我认为SelectListItem
是一种泛型,但经过进一步研究发现它是一个具体的MVC类型。谢谢你指出它!