この一見単純な質問への回答として、多くのことを書くことができます。実際、 Simple-Talk.comの記事「LINQ Secrets Revealed: Chaining and Debugging 」に詳しく書いています。その要点を以下にまとめます。
- デバッガーを使用して一部の LINQ クエリにステップ インできますが、クエリ内の式とステートメントの構成によって異なります (ステートメントにのみステップ インできるため)。
- LINQ メソッド チェーンが機能するのは、基本的な規則によるものです。つまり、各非ターミナルメソッドは
IEnumerable<T>
入力として受け取り、出力として返しIEnumerable<T>
ます。
- その基本的なルールに準拠している限り、必要に応じて、「no-op」ステートメントを挿入して「足がかり」を与えることができます。つまり、
.Select(z => z)
結果を伴わずに常にメソッドチェーンを配置できることを認識し、そのバリエーションを使用しますz => { return z; }
。
- 同様に、潜在的なブレークポイントを提供するだけでなく、診断メソッドを挿入して出力を提供することもできます。LINQ だけでなく C# 全般の優れたスクラッチパッドであるLINQPad
Dump()
は、その強力なメソッドを装ってこれを提供します。Dump は、複雑なデータ構造を驚くほど視覚化するオブジェクト ビジュアライザーです。
- Bart De Smet の有益な記事LINQ to Objects – Debuggingでの作業に基づいて、単純化されたフレーバーを
Dump
Visual Studio に戻すことができます。最初に述べた私の記事に添付されたコードを提供します。
- LINQPad ビジュアライザーに関する Robert Ivanc の作業のおかげで、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);
Dump 拡張メソッドを 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);
... Figure の左側または右側としてそれぞれレンダリングされた出力を取得するには、次のようにします。

ティーザーとして、これは確かに便利ですが、LINQPad が同じ出力で実行できる拡張された視覚化を実際に確認する必要があると言いたいと思います (便宜上、リンクを再度示します)。