3

私はlinqが初めてです。そのため、linqがどのように機能しているのか理解できないことがあります。そのため、VS2010 IDE には、linq の実行を詳細にデバッグするためのツールまたは組み込みメカニズムがあります。このlinqクエリがあるとします

var to_search = new[] { "Geo", "JCB" };

var result = from sr in list
             let w = to_search.FirstOrDefault(ts => sr.Title.ToLower().Contains(ts.ToLower()))
             where w != null
             let a = new {sr=sr, word=w.ToLower()}
             group a by a.word into g
             orderby g.Count() descending
             let sorted = g.OrderByDescending(a=> a.sr.Title.Select((c, i) => a.sr.Title.Substring(i)).Count(sub => sub.ToLower().StartsWith(a.word)))
             from a in sorted 
             select a.sr;

var completeList = result.Concat(list.Except(result));

上記の linq クエリを詳細にデバッグする方法。私を導いてください。ありがとう。

4

3 に答える 3

7

この一見単純な質問への回答として、多くのことを書くことができます。実際、 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# 全般の優れたスクラッチパッドであるLINQPadDump()は、その強力なメソッドを装ってこれを提供します。Dump は、複雑なデータ構造を驚くほど視覚化するオブジェクト ビジュアライザーです。
  • Bart De Smet の有益な記事LINQ to Objects – Debuggingでの作業に基づいて、単純化されたフレーバーをDumpVisual 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 の左側または右側としてそれぞれレンダリングされた出力を取得するには、次のようにします。 Visual Studio の Dump メソッドからの診断出力

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

于 2012-07-12T19:19:39.120 に答える
1

私が行う方法は、クエリにブレークポイントを挿入するか、LINQPad というツールを使用することです。 http://www.linqpad.net/

于 2012-07-11T21:47:27.507 に答える
0

他のコードと同じように、ブレーク ポイントを配置できるはずです。私は頻繁に LINQ 構文を対応する拡張メソッドとして書き出すので、100% 確実ではありません。

ただし、これは別のオプションです。拡張メソッドを使用してクエリを書き直し、各メソッドにブレーク ポイントを追加することもできます。

ただし、疑わしい場合は、F11 を使用してください :)

また、LINQPad はここでかなり役立つはずです。

于 2012-07-11T20:29:44.910 に答える