很多都可以寫回應這個看似簡單的問題!事實上,我已經在Simple-Talk.com上的文章LINQ Secrets Revealed: Chaining and Debugging中詳細寫過。下面是它的要點總結:
- 您可以進入與調試一些LINQ查詢,但在查詢依賴於表達式和語句的組成(因爲你只能跨上聲明) 。
- LINQ方法鏈由於基本規則而起作用:每個非終端方法以
IEnumerable<T>
作爲輸入並返回IEnumerable<T>
作爲輸出。
- 如果您願意,只要符合該基本規則,您可以注入一個「禁止使用」聲明來給您一個「墊腳石」。也就是說,意識到你總是可以將
.Select(z => z)
放在方法鏈中,而不會產生任何後果,請使用其中的變體:z => { return z; }
。
- 您可以類似地注入一種診斷方法來提供輸出,而不僅僅提供一個潛在的斷點。 LINQPad,不僅僅是LINQ,而是一般的C#的優秀暫存器,它以其強大的
Dump()
方法的幌子提供了這一點。轉儲是一種對象可視化工具,可提供令人驚歎的複雜數據結構可視化。
- 根據Bart De Smet在其內容豐富的文章LINQ to Objects – Debugging中的工作,您可以將
Dump
的簡化版帶回到Visual Studio中 - 我提供的代碼附在頂部提到的文章中。
- 感謝Robert Ivanc在LINQPad Visualizer上的工作,您甚至可以將LINQPad可視化工具帶入Visual Studio(儘管您需要手動爲單個表達式啓動它;您無法將其掛接到
Dump()
方法)。
作爲一個簡單的例子,考慮這個簡單的方法鏈:
string[] Words = new string[]
{" KOOKABURRA", "Frogmouth", "kingfisher ", "loon", "merganser"};
Words
.Select(word => word.Trim())
.Select(word => word.ToLower())
.Where(word => word.StartsWith("k"))
.OrderBy(word => word);
一旦你包括轉儲擴展方法在Visual Studio項目,您可以微創儀器像這樣...
Words
.Select(word => word.Trim())
.Dump()
.Select(word => word.ToLower())
.Dump()
.Where(word => word.StartsWith("k"))
.Dump()
.OrderBy(word => word)
.Dump();
...或更多精心這樣的...
Words
.Dump(w => "ORIGINAL: " + w, ConsoleColor.Yellow)
.Select(word => word.Trim())
.Dump(w => "TRIMMED: " + w, ConsoleColor.Yellow)
.Select(word => word.ToLower())
.Dump(w => "LOWERCASE: " + w, ConsoleColor.Green)
.Where(word => word.StartsWith("k"))
.Dump(w => "FILTERED to 'K': " + w, ConsoleColor.Red)
.OrderBy(word => word)
.Dump(w => "SORTED: " + w, ConsoleColor.Blue);
...得到的輸出呈現爲無論是左側或圖的右側,分別爲:
作爲一個傳情,我會說雖然這確實很有用,但您確實必須看到LINQPad可以使用相同的輸出(here再次爲您提供方便)所做的增強可視化。
爲什麼不把它分解成小塊,並寫每個單元的單元測試?然後寫一個整體的單元測試? – 2012-07-11 20:31:56
請看這篇文章 http://stackoverflow.com/questions/118341/how-to-debug-a-linq-statement – james31rock 2012-07-11 20:33:18
調試LINQ結果的一部分困難是它將默認爲IEnumerable並被評估懶惰,所以傳統的VS IDE調試工具只會幫助你。我推薦LINQPad,如果你想在LINQ中塗鴉和玩結果。 –
2012-07-11 20:37:32