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

C# 有没有办法将lambda表达式作为变量或参数传递?,c#,.net,linq,lambda,C#,.net,Linq,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 DoIt(IEnumerable a, Action<IEnum

我需要将lambda查询作为一个参数传递,下面的代码是示例代码,我很有兴趣为它找到一个实现,这里有一些示例:类似这样的东西:

var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
var expr2 = TakeWhile((n, index) => n >= index));
public void DoIt(IEnumerable a, Action<IEnumerable> performThis)
{
  performThis(a);
}
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);
        }
    }
}
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);
然后像这样使用它:

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);
}
public void UseLambda(IEnumerable源代码,lambda Expr){
var items=Expr.Compile(源代码);
foreach(项目中的var项目)
Console.Writeline(item.ToString());
}
公共图书馆{
名单编号=新名单{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);
使用lambda(数字,expr1);
}

有人对此有想法吗?

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

var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
var expr2 = TakeWhile((n, index) => n >= index));
public void DoIt(IEnumerable a, Action<IEnumerable> performThis)
{
  performThis(a);
}
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);
        }
    }
}
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);
public void DoIt(IEnumerable a,Action performThis)
{
执行(a);
}
但它的意义何在?与其调用应用lambda的方法,为什么不像在代码的最后几行那样直接调用它呢?

检查

使用系统;
公共类LambdaExpression
{
公共静态void Main()
{
Func convert=s=>s.ToUpper();
字符串名称=“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<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);
    }
}
static void Main(字符串[]args)
{
名单编号=新名单{10、24、9、87、193、12、7、2、-45、-2、9};
Func expr=n=>n.Where(n1=>n1>6).OrderBy(n1=>n1%2==0).选择(n1=>n1);
使用lambda(数字、表达式);
}
私有静态无效使用lambda(列表编号,
Func expr)
{
var值=expr(数字);
foreach(值中的var项){
控制台写入线(项目);
}
}

你的意思是这样的吗:

var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
var expr2 = TakeWhile((n, index) => n >= index));
public void DoIt(IEnumerable a, Action<IEnumerable> performThis)
{
  performThis(a);
}
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);
        }
    }
}
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);

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

var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
var expr2 = TakeWhile((n, index) => n >= index));
public void DoIt(IEnumerable a, Action<IEnumerable> performThis)
{
  performThis(a);
}
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);
        }
    }
}
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);
Func expr1=
l=>l.Where(n=>n>6).OrderBy(n=>n%2==0).选择(n=>n);
Func expr2=
l=>l.TakeWhile((n,索引)=>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(IEnumerable源代码)
,Func lambda)
{
var项目=λ(来源);
foreach(项目中的var项目)
Console.Writeline(item.ToString());
}
}
然后你我想你已经找到了你想要的。

public void UseLambda(IEnumerable源代码,Expression expr)
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);
}
{ var items=expr.Compile(); foreach(items.Invoke中的var项(源)) { Console.WriteLine(item.ToString()); } } 公共图书馆 { 表达式expr=s=>s.Where(n=>n>6).OrderBy(n=>n%2==0).Select(n=>n); var list=新列表{10,24,9,87,193,12,7,2,-45,-2,9}; UseLambda(列表,expr); }
define expr1、expr2中出现错误:“System.Collections.IEnumerable”不包含“Where”的定义,并且找不到扩展方法“Where”,其中“接受”System.Collections.IEnumerable类型的第一个参数(是否缺少using指令或程序集引用?)