遇到此问题时,我试图从数组中收集一堆函数调用:
array.Select(x => () => Function(x))
将不起作用。没关系,我怎么玩。该应用程序的完整工作代码很简单:
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Linq;
public class Program
{
public static void Main()
{
//This won't work?
//IEnumerable<Expression<Action>> expressions0 = values.Select(i => () => print(i));
List<Expression<Action>> expressions1 = new List<Expression<Action>>();
foreach (int i in values)
{
expressions1.Add(() => print(i));
}
}
static int[] values = new int[]{1, 2, 3, 4};
static void print(int i)
{
Console.WriteLine(i);
}
}
我尝试了不同的事情:
IEnumerable<Expression<Action>> expressions0 = values.Select(i => (() => print(i)));
IEnumerable<Expression<Action>> expressions0 = values.Select(i => {return () => print(i);});
许多其他人,但是linq只是不想让我得到表达式的集合。
答案 0 :(得分:1)
这应该有效:
IEnumerable<Expression<Action>> expressions0
= values.Select(i => (Expression<Action>) (() => print(i)));
(将您的lambda转换为表达式树的编译器魔术在那里不起作用,因此您需要在转换时明确显示)。
但是请注意,您在此处使用闭包(i
),如果尝试调用已编译的表达式,可能会失败。表达式列表就在那里(与您将它们手动添加到foreach
上的列表时一样)
不确定要用于什么
Edit :我刚刚对其进行了测试,但确实无法调用,因为它无法访问i
(https://dotnetfiddle.net/GMbswQ),但是实际上是在{{1 }}正常工作(我用一个常量和https://dotnetfiddle.net/IlW3tW替换了IEnumerable<Expression<Action>>
)