C#将Lambda表达式作为方法参数传递

Ada*_*itt 94 c# linq lambda

我有一个lambda表达式,我希望能够传递并重用.这是代码:

public List<IJob> getJobs(/* i want to pass the lambda expr in here */) {
  using (SqlConnection connection = new SqlConnection(getConnectionString())) {
    connection.Open();
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
      (job, student) => {         
        job.Student = student;
        job.StudentId = student.Id;
        return job;
        },
        splitOn: "user_id",
        param: parameters).ToList<IJob>();   
  }   
Run Code Online (Sandbox Code Playgroud)

这里的关键是,我希望能够将我在这里使用的lambda表达式传递给调用此代码的方法,因此我可以重用它.lambda表达式是我的.Query方法中的第二个参数.我假设我想要使用Action或Func,但我不太确定它的语法是什么或它是如何工作的.有人可以举个例子吗?

Ode*_*ded 115

使用Func<T1, T2, TResult>委托作为参数类型并将其传递给您Query:

public List<IJob> getJobs(Func<FullTimeJob, Student, FullTimeJob> lambda)
{
  using (SqlConnection connection = new SqlConnection(getConnectionString())) {
    connection.Open();
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
        lambda,
        splitOn: "user_id",
        param: parameters).ToList<IJob>();   
  }  
}
Run Code Online (Sandbox Code Playgroud)

你会称之为:

getJobs((job, student) => {         
        job.Student = student;
        job.StudentId = student.Id;
        return job;
        });
Run Code Online (Sandbox Code Playgroud)

或拉姆达分配给一个变量,并通过英寸


小智 23

如果我了解您需要以下代码.(通过参数传递表达式lambda)方法

public static void Method(Expression<Func<int, bool>> predicate) { 
    int[] number={1,2,3,4,5,6,7,8,9,10};
    var newList = from x in number
                  .Where(predicate.Compile()) //here compile your clausuly
                  select x;
                newList.ToList();//return a new list
    }
Run Code Online (Sandbox Code Playgroud)

通话方式

Method(v => v.Equals(1));
Run Code Online (Sandbox Code Playgroud)

你可以在他们的班级做同样的事情,看这是例子.

public string Name {get;set;}

public static List<Class> GetList(Expression<Func<Class, bool>> predicate)
    {
        List<Class> c = new List<Class>();
        c.Add(new Class("name1"));
        c.Add(new Class("name2"));

        var f = from g in c.
                Where (predicate.Compile())
                select g;
        f.ToList();

       return f;
    }
Run Code Online (Sandbox Code Playgroud)

通话方式

Class.GetList(c=>c.Name=="yourname");
Run Code Online (Sandbox Code Playgroud)

我希望这很有用

  • 你能解释为什么我们需要`.Where`中的`Compile()`吗?我也看到它在没有它的情况下也能工作。 (3认同)

Szt*_*upY 7

Lambda表达式具有Action<parameters>(如果它们不返回值)或Func<parameters,return>(如果它们具有返回值)的类型.在您的情况下,您有两个输入参数,并且您需要返回一个值,因此您应该使用:

Func<FullTimeJob, Student, FullTimeJob>
Run Code Online (Sandbox Code Playgroud)


dev*_*tal 5

您应该使用委托类型并将其指定为您的命令参数。您可以使用其中一种内置委托类型 -ActionFunc.

在您的情况下,您的委托看起来像接受两个参数,并返回一个结果,因此您可以使用Func

List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)
Run Code Online (Sandbox Code Playgroud)

然后,您可以调用GetJobs传入委托实例的方法。这可以是匹配该签名的方法、匿名委托或 lambda 表达式。

PS 您应该使用 PascalCase 作为方法名称 - GetJobs,而不是getJobs.