0

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

我有一个采用 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 表达式,我只需要 Findtype 来获取结果并将其存储在局部变量中。

我可能再次错过了这一点,但非常感谢您的指导。

4

4 回答 4

1

您正在尝试将表达式分配给 List<>(用户)类型的变量。

我怀疑你真的想这样做:

Users = finder(Users)

尽管这本身并没有多大意义。

于 2010-08-16T15:54:43.793 回答
0

您正在尝试将x => finder(x)(一个 lambda 表达式,例如匿名委托)分配给Users一个 类型的变量List<MembershipUser>。这是类型不匹配。

如果您想过滤现有的用户列表(这假设Users已经初始化并填充),然后将您的代码更改为

Users = finder(Users);

如果您要过滤其他列表,请按照以下方式执行操作

Users = finder(myUserList);

如果finder应该返回一个列表而不需要任何参数,则将其从 a 更改Func<>为 anAction<>

void FindType<T>(Action<T> finder) where T : List<MembershipUser>
{
    Users = finder();
}
于 2010-08-16T15:53:26.463 回答
0

如果不确切了解您在做什么,我可以告诉您您的语法已关闭,并且您没有传递正确数量的参数:

internal void FindType<T>(Func<List<MembershipUser>, T> finder, T x)
    where T : List<MembershipUser>
{
    Users = finder(T);
}

在这种情况下,由于您对类型进行了如此严格的限制,因此泛型的使用是多余的。删除它们可能会使您的代码更易于理解。

如果您准确地解释了您希望该方法做什么,我们应该能够为您提供更好的指导来解决如何修复代码。

于 2010-08-16T15:56:31.140 回答
0

我认为您想尝试将 MembershipUser 的任意 Enumerable 过滤到本地列表中。因此,您的过滤器应该是 type Func<IEnumerable<MembershipUser>, List<MembershipUser>>。另外缺少一件事:您要过滤的此列表。当您调用它时,它必须作为参数传递给过滤器。我假设它是作为参数传递的,但它也可以很容易地成为您的类的另一个内部变量或属性。

这将产生以下函数(完整工作示例见下文):

void FindType(Func<IEnumerable<MembershipUser>, List<MembershipUser>> filter, IEnumerable<MembershipUser> list)
{
   Users = filter(list);
}

我从大学的函数式编程课程中学到了一些东西:首先让你的类型正确,然后其他的会随之而来。想想你在输入和输出方面想要做什么。不仅适用于您的函数,也适用于您的 lambda。(本质上是无名的函数)。

完整的工作样本:

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; }
            }
        }
    }
}
于 2010-08-16T17:53:36.190 回答