我需要将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);
}
有人对此有所了解吗?
答案 0 :(得分:8)
检查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(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);
}
}
答案 1 :(得分: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);
您的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());
}
}
然后你认为你有你想要的东西。
答案 2 :(得分:1)
你的意思是这样的:
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);
答案 3 :(得分:0)
嗯,一个lambda只不过是一个委托,所以你可以有一个像这样的方法:
public void DoIt(IEnumerable a, Action<IEnumerable> performThis)
{
performThis(a);
}
但它的感觉在哪里?而不是调用应用lambda的方法,为什么不像在代码的最后几行那样直接调用它?
答案 4 :(得分:0)
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);
}