我的应用程序经常迭代锯齿状数组。而不是在整个地方显式嵌套循环,我正在尝试实现类似功能,我可以传递一个lambda。
我最近的尝试看起来是这样的:
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);
}
}
}
答案 0 :(得分:2)
Compile
方法怎么样:
foreach (var Item in A)
{
if (Item is Array)
ForEachJagged<T>((Array)Item, F);
else
F.Compile()((T)Item);
}
答案 1 :(得分:1)
如果您真的只挂了一个foreach
循环,那么您可以执行以下操作:
foreach (var item in arr.SelectMany(a => a))
{
Console.Write(item.ToString() + " ");
}
但实际上,我只是建议您进行嵌套。尝试使代码看起来漂亮所花费的所有努力都是为了A)使代码看起来更漂亮你,B)使代码运行明显,如果不是显着慢,或C)两者。
如果这是你的缩进,你总是可以看起来像这样:
foreach (var nest in arr)
foreach (var item in nest)
{
Console.Write(item.ToString() + " ");
}