有没有办法将lambda表达式作为变量或参数传递?

Sae*_*eid 14 .net c# linq lambda

我需要传递lambda查询作为参数,以下代码是示例,我很有兴趣为它找到一个工具,有样本:有些东西是这样的:

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

并使用它像这样:

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);
}
Run Code Online (Sandbox Code Playgroud)

有人对此有所了解吗?

Ama*_*ure 8

检查Func(Of T,TResult)代表(MSDN)

using System;

public class LambdaExpression
{
   public static void Main()
   {
       Func<string, string> convert = s => s.ToUpper();

       string name = "Dakota";
       Console.WriteLine(convert(name));   
   }
}
Run Code Online (Sandbox Code Playgroud)

来自MSDN

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

编辑

您案件的可能解决方案

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*uel 8

如果您像这样定义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);
Run Code Online (Sandbox Code Playgroud)

而你的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());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你我认为你有你想要的东西.

  • 有在限定expr1的错误,表达式2:"System.Collections.IEnumerable"不包含可发现"其中" a的定义和没有扩展方法"位置"接受类型"System.Collections.IEnumerable"的第一个参数(你错过了using指令或程序集引用吗?) (2认同)