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 只是不想让我得到表达式的集合。
解决方案
这应该有效:
IEnumerable<Expression<Action>> expressions0
= values.Select(i => (Expression<Action>) (() => print(i)));
(将您的 lambda 转换为表达式树的编译器魔法在此不起作用,因此您需要明确地进行转换)。
但是请注意,您在那里使用了一个闭包 ( i
),如果您尝试调用已编译的表达式,则可能会失败。表达式列表会在那里(与foreach
手动将它们添加到列表中时相同)
不知道你想用这个做什么
编辑:我刚刚对其进行了测试,它确实无法调用,因为它无法访问i
(https://dotnetfiddle.net/GMbswQ),但是实际插入IEnumerable<Expression<Action>>
工作正常(我i
用一个常量替换了,瞧:https:/ /dotnetfiddle.net/IlW3tW )
推荐阅读
- java - 为什么 RecyclerView 没有显示项目?
- r - 与单元格值小于 1 的成对比较
- python - 我想将文件作为附件发送到 API POST 请求
- acumatica - Acumatica - 如何将过滤器 PostalCode 添加到位置选择器
- python - 熊猫中任意列表的笛卡尔积
- python - 如何在时间为相对周而不是时间戳的情况下应用滚动功能并应用分组
- jquery - 在 jsGrid itemTemplete 函数返回的内容上添加引导工具提示
- webpack - 使用 Styled JSX 的自定义媒体查询 - Next v. 9.0.6
- java - 如何使用spring正确发布DDD域事件?
- r - 如何在 for 循环中声明全局变量,为什么 else 语句读作意外?