2009-11-23 79 views
2

這是一個作業問題。幫助將foreach轉換爲Linq

我在我們的域模型上做了差異化,並且已經設置好了,以便我可以迭代檢查域內的certian差異的操作列表。我傳入差異函數以及對象圖的前後狀態,以在DiffContext中生成結果 - 稍後將用於設置調用另一服務的有效內容。不過,我已經做了一些修改,並需要與LINQ的語法

所以,我有以下的代碼幫助...

public static IEnumerable<DiffContext> GetFirstDifference<T>(IEnumerable<Func<T, T, DiffContext>> diffOperations, T beforeState, T afterState) 
{ 
    return from op in diffOperations 
      let diff = op(beforeState, afterState) 
      where diff.FoundDifference 
      select diff; 
} 

其中我修改爲使用Func<T, T, IEnumerable<DiffContext>>而非以前Func<T, T, DiffContext>的 - 因爲現在我的diff操作可以返回多個差異。像這樣..

public static IEnumerable<DiffContext> GetFirstDifference<T>(IEnumerable<Func<T, T, IEnumerable<DiffContext>>> diffOperations, T beforeState, T afterState) 
{ 
    foreach (var op in diffOperations) 
    { 
     foreach (var diff in op(beforeState, afterState)) 
     { 
      yield return diff; 
     } 
    } 
} 

但現在我有這個嵌套的foreach,我希望有一些幫助將其轉換爲Linq等價物。你能幫我嗎?

謝謝Jon Skeet。我現在有以下代替嵌套的foreach:

return from op in diffOperations 
      from diff in op(beforeState, afterState) 
      where diff.FoundDifference 
      select diff; 

回答

4

是啊 - 你想two "from" clauses,基本上 - 即進行扁平化操作。這使用SelectMany LINQ運算符。由於這是家庭作業,我不願意發佈完整的代碼 - 但我會說這是一個三行LINQ查詢(使用自然斷行)。想想你想從「每個集合」中得到什麼...

只要添加註釋,如果這還不夠提示。