2016-12-29 49 views
0

我的應用程序頻繁迭代鋸齒狀數組。而不是顯式嵌套循環到處,我試圖實現像功能的foreach,我可以通過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表達式的正確方法是什麼?

- 編輯 -

工作鋸齒狀的foreach基於斯拉瓦Utesinov的反饋:

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); 
     } 
    } 
} 
+1

什麼是'表達>'的目的。爲什麼不接受一個'動作'?使用表達式樹通常只需要將lambda「傳輸」到其他層,比如希望C#中的LINQ'Select'作爲SQL'SELECT'在數據庫中執行時。 –

+0

@馬丁,沒有目的。我是C#的新手,並且出軌了。 – srking

回答

2

什麼Compile方法:

foreach (var Item in A) 
{ 
    if (Item is Array) 
     ForEachJagged<T>((Array)Item, F); 
    else  
     F.Compile()((T)Item); 
} 
+0

謝謝Slava。這是有效的,但在我的真實應用程序中,與嵌套循環相比,JaggedForEach太慢了。我想這個緩慢是由於Compile(),但我不確定。 – srking

+2

而不是'Expression >'只需使用'Action ',所以你需要在沒有'Compile'的情況下調用'F((T)Item)' –

+0

只需使用Action 就行得通! – srking

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