Linq无法选择Expression <action>?

时间:2018-08-27 18:17:54

标签: c# linq

遇到此问题时,我试图从数组中收集一堆函数调用:

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只是不想让我得到表达式的集合。

1 个答案:

答案 0 :(得分:1)

这应该有效:

IEnumerable<Expression<Action>> expressions0 
         = values.Select(i => (Expression<Action>) (() => print(i)));

(将您的lambda转换为表达式树的编译器魔术在那里不起作用,因此您需要在转换时明确显示)。

但是请注意,您在此处使用闭包(i),如果尝试调用已编译的表达式,可能会失败。表达式列表就在那里(与您将它们手动添加到foreach上的列表时一样)

不确定要用于什么

Edit :我刚刚对其进行了测试,但确实无法调用,因为它无法访问ihttps://dotnetfiddle.net/GMbswQ),但是实际上是在{{1 }}正常工作(我用一个常量和https://dotnetfiddle.net/IlW3tW替换了IEnumerable<Expression<Action>>