Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于转换IEnumerable的Lambda扩展方法<;T>;列出<;选择列表项>;_C#_Linq_Generics - Fatal编程技术网

C# 用于转换IEnumerable的Lambda扩展方法<;T>;列出<;选择列表项>;

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

我需要一种方法来创建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);
公共类角色
{
公共字符串名称{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类型。谢谢你指出它!