2012-10-30 82 views
4

我正在嘗試通過以下IEnumerable擴展方法,我稱爲DumpIt。調試器不會逐步完成它。我怎樣才能讓調試器進入這個擴展方法?C#LINQ通過IEnumerable擴展方法調試

我的單元測試:

[Test] 
     public void TestDumpIt() 
     { 
      var words = 
       new string[] {" KOOKABURRA", "Frogmouth", "kingfisher ", "loon", "merganser"}; 

      var result = words 
       .DumpIt(d => "original: " + d) 
       .Select(word => word.Trim()) 
       .DumpIt(d => "trimmed: " + d) 
       .Select(word => word.ToLower()) 
       .DumpIt(d => "lower cased: " + d) 
       .Where(word => word.StartsWith("k")) 
       .DumpIt(d => "starts with k: " + d) 
       .OrderBy(word => word) 
       .DumpIt(d => "orderd: " + d); 
     } 

擴展方法:

public static IEnumerable<T> DumpIt<T>(this IEnumerable<T> input, 
    Func<T, string> toString 
    ) 
{ 
    foreach (var item in input) 
    { 
     Output.ActivePane.Activate(); 
     Output.ActivePane.OutputString(
      ShowWhiteSpace ? '[' + toString(item) + ']' : toString(item)); 

     yield return item; 
    } 
} 

感謝您的幫助!

+5

調試器不會停止在擴展方法主體本身的中斷點上嗎? – nieve

+0

從make make clean開始,然後重建整個事物。有時一個調試文件沒有得到更新,損壞,不同步等,程序工作,它只是不能正確調試。邊注;一次只調用每個項目的選擇器功能被認爲是很好的做法。這很容易做到這一點;只需將結果保存到一個變量中,並將它們打印兩次而不是兩次計算。 – Servy

+0

我在LINQ上看到你正在使用我的[舊文章]中的代碼(https://www.simple-talk.com/dotnet/net-framework/linq-secrets-revealed-chaining-and-debugging/)調試。我剛剛做了一篇關於該文章的續篇 - 6年後(!) - 在整潔的Visual Studio擴展的幫助下將LINQ調試提升到了一個新層次 - 請參閱[LINQ調試和可視化](https:// www .simple-talk.com/dotnet/net-development/linq-debugging-visualization /) –

回答

9

使用yield時,您正在使用延遲執行。您正在使用的其他LINQ方法也使用延遲執行。在開始枚舉resultTestDumpIt之前,DumpIt方法實際上不會被調用。如果你想看到調用的代碼,你需要枚舉枚舉。例如,您可以在末尾添加result.ToList()以強制枚舉。

+0

Duh在我身上!感謝馬特 - 這解決了它! – Frekster