我想我在这里遗漏了一些东西,但有人可以解释我是如何让这个工作的
我有一个接受Func的方法,我想在方法中执行该func,将结果存储在本地var中。
internal List<MembershipUser> Users;
internal void FindType<T>(Func<List<MembershipUser>, T> finder) where T :
List<MembershipUser>
{
Users = x => finder(x);
}
这不起作用。它说它无法转换Lambda,因为它不是委托类型。
有什么想法吗?
好的,接受了错误使用仿制药,谢谢。
这就是我试图称之为:
FindType<List<MembershipUsers>>(
members =>
{
return members.Where(member => member.IsApproved).ToList<MembershipUser>();
};
所以我已经有了我的lamda exprssion我只需要Findtype来获得结果并将其存储在局部变量中。
我可能再次忽略了这一点,但指导非常感谢。
答案 0 :(得分:1)
您正在尝试将表达式分配给List&lt;&gt;类型的变量(用户)。
我怀疑你真的想要这样做:
Users = finder(Users)
虽然这本身并没有多大意义。
答案 1 :(得分:0)
您正尝试将x => finder(x)
(lambda表达式,例如匿名委托)分配给Users
,List<MembershipUser>
类型的变量。这是一种类型不匹配。
如果要过滤现有的用户列表(假设Users
已初始化并已填充),请将代码更改为
Users = finder(Users);
如果您要过滤其他列表,请按照
的方式执行操作Users = finder(myUserList);
如果finder
应该返回列表而不需要任何参数,则将其从Func<>
更改为Action<>
void FindType<T>(Action<T> finder) where T : List<MembershipUser>
{
Users = finder();
}
答案 2 :(得分:0)
如果不完全理解你在做什么,我可以告诉你,你的语法已关闭,而你没有传递正确数量的参数:
internal void FindType<T>(Func<List<MembershipUser>, T> finder, T x)
where T : List<MembershipUser>
{
Users = finder(T);
}
在这种情况下,由于您严格限制类型,因此使用泛型是非常多余的。删除它们可能会使您的代码更容易理解。
如果您准确解释了您希望该方法做什么,我们应该能够为您提供更好的指导,帮助您解决代码问题。
答案 3 :(得分:0)
我认为您想尝试将任意Enumerable MembershipUser过滤到本地List中。因此,您的过滤器应为Func<IEnumerable<MembershipUser>, List<MembershipUser>>
类型。此外还缺少一件事:您要尝试过滤的此列表。调用它时,必须将其作为参数传递给过滤器。我假设它作为参数传递,但它可以很容易地成为你的类的另一个内部变量或属性。
这导致以下功能(完整工作样本见下文):
void FindType(Func<IEnumerable<MembershipUser>, List<MembershipUser>> filter, IEnumerable<MembershipUser> list)
{
Users = filter(list);
}
我从大学的函数式编程课程中学到了一些东西:首先让你的类型正确,然后其余的将会出现。想想你在输入和输出方面要做的事情。不仅适用于您的功能,也适用于您的lambdas。 (这基本上是无名的功能)。
完整的工作样本:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Sample d = new Sample();
IEnumerable<MembershipUser> ll = new List<MembershipUser>()
{
new MembershipUser() { Name ="1", IsApproved=false},
new MembershipUser() { Name ="2", IsApproved=true},
};
d.FindType(members => members.Where(m => m.IsApproved).ToList(), ll);
Console.WriteLine(d.Users.Count());
}
class MembershipUser
{
public string Name
{get;set;}
public bool IsApproved
{get;set;}
}
class Sample
{
private List<MembershipUser> users;
public void FindType(Func<IEnumerable<MembershipUser>, List<MembershipUser>> filter, IEnumerable<MembershipUser> list)
{
users = filter(list);
}
public List<MembershipUser> Users
{
get { return users; }
}
}
}
}