【发布时间】:2016-12-29 05:56:20
【问题描述】:
我的应用程序经常迭代锯齿状数组。我试图实现类似 foreach 的功能,而不是到处都是显式的嵌套循环。
我最近的尝试是这样的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JaggedTest
{
static class Global
{
// Does not work
public static void ForEachJagged<T>(Array A, System.Linq.Expressions.Expression<Action<T>> F)
{
foreach (var Item in A)
{
if (Item is Array)
{
ForEachJagged<T>((Array)Item, F);
}
else
{
System.Linq.Expressions.InvocationExpression Invo =
System.Linq.Expressions.Expression.Invoke(F,
System.Linq.Expressions.Expression.Constant(Item));
Console.WriteLine(Invo.ToString());
// How to execute "Invo" ?
}
}
}
}
class Program
{
static void Main(string[] args)
{
int[][] Foo = new int[3][] {
new int[] {1}
,new int[] {2,3,4,5,6}
,new int[] {7,8,9}
};
Global.ForEachJagged<int>(Foo, X => Console.Write(X.ToString() + " "));
}
}
}
此程序为 lambda 表达式生成预期的“ToString”调试输出,但我一直在尝试实际执行此表达式。执行作为函数参数传递的 lambda 表达式的正确方法是什么?
-- 编辑--
根据 Slava Utesinov 的反馈工作锯齿状的 foreach:
public static void ForEachJagged<T>(Array A, Action<T> F)
{
foreach (var Item in A)
{
if (Item is Array)
{
ForEachJagged<T>((Array)Item, F);
}
else
{
F((T)Item);
}
}
}
【问题讨论】:
-
Expression<Action<T>>的目的是什么。为什么不接受Action<T>?仅当您想将 lambda“传输”到其他层时,通常才需要使用表达式树,例如当您希望 C# 中的 LINQSelect在数据库中作为 SQLSELECT执行时。 -
@Martin,没有目的。我是 C# 新手,出轨了。