如何滚动我自己的Jagged Foreach?

时间:2016-12-29 05:56:21

标签: c# linq lambda

我的应用程序经常迭代锯齿状数组。而不是在整个地方显式嵌套循环,我正在尝试实现类似功能,我可以传递一个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);
      }
   }
}

2 个答案:

答案 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() + " ");
}