かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

LINQで書くとデバッグしづらいよね?そんなことないよ

小ネタです。 LINQで処理をぱぱっと1ステートメントで書けると気持ちいいですよね。 でも、デバッグ難しくない?ということがあるのですが大丈夫です安心してください。

ブレークポイントのはり方のコツさえつかめば大丈夫です。例えば以下のようなコードがあるとします。

using System;
using System.Linq;

namespace ConsoleApp10
{
    class Program
    {
        static void Main(string[] args)
        {
            var numbers = new[] { 1, 2, 2, 3, 3, 3, 4, 4, 4 };
            var values = numbers
                .Where(x => x % 2 == 0)
                .Distinct()
                .Select(x => x * x);

            foreach (var value in values)
            {
                Console.WriteLine(value);
            }
        }
    }
}

Selectに意図した値が渡ってきてるのか見たい…!!(今回の場合2と4が渡ってくるはずですよね) そんなときのデバッグ手法ですが、まずシンプルな方法として古き良きprintfデバッグがありますよね。

using System;
using System.Linq;

namespace ConsoleApp10
{
    class Program
    {
        static void Main(string[] args)
        {
            var numbers = new[] { 1, 2, 2, 3, 3, 3, 4, 4, 4 };
            var values = numbers
                .Where(x => x % 2 == 0)
                .Distinct()
                .Select(x => { Console.WriteLine(x); return x* x; });

            foreach (var value in values)
            {
                Console.WriteLine(value);
            }
        }
    }
}

気持ちよさ台無しなうえに確認したいところに都度都度出力入れてくなんて現実的じゃないですよね。 ということでブレークポイントはりましょう。

ブレークポイントの一番簡単?というか多くの人が知ってるポピュラーなやり方としてはエディタの左端のグレー部分でクリックするものだと思います。

f:id:okazuki:20170723165211p:plain

でも、この方法だと行にしかはれないです。そうLINQのラムダ式の中で止めたいというのに対応できない。 最近のデバッガは進化してて、ラムダ式の中にもブレークポイントはることができます。

やり方は簡単、ラムダ式の中にカーソルを持って行ってF9を押すだけ。 マウスが好きな人は、ラムダ式の中にカーソルを持って行って右クリックメニューからブレークポイントの挿入をすればOKです。

f:id:okazuki:20170723165514p:plain

すると、こんな感じに色がつきます。

f:id:okazuki:20170723165602p:plain

この状態でデバッグ実行するとばっちりラムダ式の中でブレークしてくれます!!

f:id:okazuki:20170723165713p:plain

ということで快適なLINQ生活を!!