首页 > 解决方案 > 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 只是不想让我得到表达式的集合。

标签: c#linq

解决方案


这应该有效:

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

(将您的 lambda 转换为表达式树的编译器魔法在此不起作用,因此您需要明确地进行转换)。

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

不知道你想用这个做什么

编辑:我刚刚对其进行了测试,它确实无法调用,因为它无法访问ihttps://dotnetfiddle.net/GMbswQ),但是实际插入IEnumerable<Expression<Action>>工作正常(我i用一个常量替换了,瞧:https:/ /dotnetfiddle.net/IlW3tW )


推荐阅读