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

我需要传递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 (IEnumerable source , lambda Expr){ var items= Expr.Compile(source); foreach(var item in items) Console.Writeline(item.ToString()); } public void Main(){ List numbers = new List { 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); } 

有人对此有所了解吗?

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

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

而你的UseLambda方法如下:

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

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

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

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

来自MSDN

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

编辑

您案件的可能解决方案

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

你的意思是这样的:

 public void UseLambda (IEnumerable source , Func where, Func order) { if(source != null) { IOrderedEnumerable 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 performThis) { performThis(a); } 

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

 public void UseLambda(IEnumerable source, Expression, IEnumerable>> expr) { var items = expr.Compile(); foreach (var item in items.Invoke(source)) { Console.WriteLine(item.ToString()); } } public void Main() { Expression, IEnumerable>> expr = s => s.Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n); var list = new List { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 }; UseLambda(list, expr); }