【问题标题】:How to invoke Func to set a local List<>如何调用 Func 设置本地 List<>
【发布时间】:2012-06-09 23:00:17
【问题描述】:

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

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

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

【问题讨论】:

  • 事实上,使该方法通用是没有意义的。相当于 FindType(Func, List> finder)

标签: c# lambda func


【解决方案1】:

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

我怀疑你真的想这样做:

Users = finder(Users)

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

【讨论】:

  • 这是我尝试运行的方法: FindType>(members => { return members.Where(member => member.IsApproved) .ToList(); };
  • 好的,如果您做出我建议的更改,结果将是用户更改为仅包含已批准成员的列表。那是你要的吗?您确定您真的不希望 FindType 返回结果吗?
【解决方案2】:

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

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

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; }
            }
        }
    }
}

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      Users = finder(Users);
      

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

      Users = finder(myUserList);
      

      如果 finder 应该返回一个不需要任何参数的列表,则将其从 Func&lt;&gt; 更改为 Action&lt;&gt;

      void FindType<T>(Action<T> finder) where T : List<MembershipUser>
      {
          Users = finder();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-13
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        相关资源
        最近更新 更多