是否有任何方法可以将lambda表达式作为变量或参数传递

本文关键字:表达式 变量 参数传递 lambda 任何 方法 是否 | 更新日期: 2023-09-27 18:21:48

我需要将lambda查询作为参数传递,下面的代码是示例,我很想为它找到一个实现,有一些示例:

var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
var expr2 = TakeWhile((n, index) => n >= index));

像这样使用:

public void UseLambda<T> (IEnumerable<T> source , lambda Expr){
var items= Expr.Compile(source);
foreach(var item in items)
     Console.Writeline(item.ToString());
}
public void Main(){
    List<int> numbers = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 };
    var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
    UseLambda(numbers, expr1);
}

有人知道吗?

是否有任何方法可以将lambda表达式作为变量或参数传递

Check Func(Of T,TResult)Delegate(MSDN)

using System;
public class LambdaExpression
{
   public static void Main()
   {
       Func<string, string> convert = s => s.ToUpper();
       string name = "Dakota";
       Console.WriteLine(convert(name));   
   }
}

来自MSDN

lambda表达式的基础类型是一个通用的Func委托。这使得可以将lambda表达式作为参数传递,而无需显式将其分配给委托。特别是,由于System.Linq命名空间中的许多类型的方法都有Func(of T,TResult)参数,因此您可以向这些方法传递lambda表达式,而无需显式实例化Func(OfT,TResolt)

编辑

案例的可能解决方案

static void Main(string[] args) 
{
    List<int> numbers = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 };
    Func<IEnumerable<int>, IEnumerable<int>> expr = n => n.Where(n1 => n1 > 6).OrderBy(n1 => n1 % 2 == 0).Select(n1 => n1);
    UseLambda<int>(numbers, expr);
}
private static void UseLambda<T>(List<T> numbers, 
                                 Func<IEnumerable<T>, 
                                 IEnumerable<T>> expr) 
{
    var values = expr(numbers);
    foreach (var item in values) {
       Console.WriteLine(item);
    }
}

如果您这样定义LINQ表达式:

Func<IEnumerable<int>, IEnumerable<int>> expr1 =
               l => l.Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
Func<IEnumerable<int>, IEnumerable<int>> expr2 = 
               l => l.TakeWhile((n, index) => n >= index);

您的UseLambda方法为:

public void UseLambda<T> (IEnumerable<T> source 
                          ,Func<IEnumerable<T>, IEnumerable<T>> lambda)
{
    var items= lambda(source);
    foreach(var item in items)
       Console.Writeline(item.ToString());
    }
}

然后你,我想你已经得到了你想要的。

你的意思是这样的吗:

public void UseLambda<T> (IEnumerable<T> source , Func<T, bool> where, Func<T, bool> order)
{
    if(source != null)
    {
        IOrderedEnumerable<T> orderBy = source.Where(where).OrderBy(order);
        foreach (T value in orderBy)
        {
            Console.WriteLine(value);
        }
    }
}

这样你就可以这样称呼它:

UseLambda(numbers, x => x > 6, x => x % 2 == 0);

好吧,lambda只不过是一个委托,所以你可以有一个这样的方法:

public void DoIt(IEnumerable a, Action<IEnumerable> performThis)
{
  performThis(a);
}

但它的意义在哪里?与其调用一个应用lambda的方法,为什么不像在代码的最后几行那样直接调用它呢?

public void UseLambda<T>(IEnumerable<T> source, Expression<Func<IEnumerable<T>, IEnumerable<T>>> expr)
{
    var items = expr.Compile();
    foreach (var item in items.Invoke(source))
    {
        Console.WriteLine(item.ToString());
    }
}

public void Main()
{
    Expression<Func<IEnumerable<int>, IEnumerable<int>>> expr = s => s.Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
    var list = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 };
    UseLambda(list, expr);
}