Visual Studioで配列やコレクションの要素を特定のプロパティだけに絞り込んでウォッチする
大変御無沙汰しておりました。
北本です。
ブログで取り上げようかなと思いつつも、結局書かずに放置してしまっていたネタの蔵出しをしようかと思います。
今回のテーマは「Visual Studioで配列やコレクションの要素を特定のプロパティだけに絞り込んでウォッチする」です。
やり方を知りたい初心者が結構いるのではないかと勝手に推測しているのですが、検索しても意外と情報が出てこなかったので、記事として纏めてみようかと思った次第です。
なお、Visual Studio 2017 Communityで確認した内容を書いていますので、他のバージョンではもしかすると差異があるかもしれません。
適当に以下のような100個のLabel要素を持つのリストを生成するコードを書いてみます。
1 2 3 4 5 6 7 8 | List<Label> labels = new List<Label>(); for(int i = 0; i < 100; i++) { Label label = new Label(); label.Text = i.ToString(); label.Location = new Point(20, i * 20); labels.Add(label); } |
ループを抜けたあたりにブレークポイントを張って実行してみましょう。
ブレークポイントで止まったら、ウォッチのウィンドウにlabelsと入力してみます。
すると、以下のように表示されました。
これを展開すると、各要素が表示されます。
値の列には「{System.Windows.Forms.Label, Text: 0}」等と表示され、型名とTextプロパティの内容が確認出来ます。
「でも、私はTextプロパティじゃなくて、Locationプロパティを確認したいんや!」
という場合はどうしましょう。
要素のところを展開してみると、以下の画像のように別に見たくもないプロパティがたくさん出てきて、お目当てのものを探すだけでも大変です。
単独の要素のLocationプロパティを見たいのであればウォッチに「labels[0].Location」とでも入力すれば済みますが、labelsの各要素のLocationプロパティを並べて表示したいなんて時はどうしましょう?
Visual Studioのウォッチに特定のプロパティのみを表示するフィルタ機能のようなものはないのかなと思いましたが、私が調べた限りではなさそうでした。
結局は、ウォッチの中でLINQのSelectメソッドを呼び出すのが無難そうな解決法だという結論に至りました。
以下の内容をウォッチに入力します。
1 | labels.Select(n => n.Location) |
引数のLocationプロパティの値を返すメソッドをラムダ式の形でSelectの引数に渡しています。これで、labelsの各要素のLocationプロパティを各要素としたListを得られます。
これをウォッチすることで、各要素のLocationプロパティを一覧化して確認出来るわけです。
以上です。