如何调用Func来设置本地List<>

时间:2010-08-16 15:47:16

标签: c# lambda func

我想我在这里遗漏了一些东西,但有人可以解释我是如何让这个工作的

我有一个接受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来获得结果并将其存储在局部变量中。

我可能再次忽略了这一点,但指导非常感谢。

4 个答案:

答案 0 :(得分:1)

您正在尝试将表达式分配给List&lt;&gt;类型的变量(用户)。

我怀疑你真的想要这样做:

Users = finder(Users)

虽然这本身并没有多大意义。

答案 1 :(得分:0)

您正尝试将x => finder(x)(lambda表达式,例如匿名委托)分配给UsersList<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; }
            }
        }
    }
}