«前の日記(2013年07月29日) 最新 次の日記(2013年08月15日)» 編集

日々をアレコレ


2013年08月11日

LINQを使ってみた

LINQ勉強会で学んだLINQの便利さを早速仕事でもと思い、調べながら使ってみたのでメモ。

今は、WPFを使ったプロジェクトでとあるGUI機能の担当。担当箇所に、動的に生成、編集、削除されるデータを、仕様に従って表示する必要があり、Canvas上に1データ1オブジェクトとして配置して、編集されたら移動やサイズ変更をしている。とりあえず、現在は表示オブジェクトをLabel型にしていて、Canvas上のオブジェクトからLabel型のものだけ操作することになる。LINQを使う前は次のような感じだった。

foreach( var child in canvas.Children)
{
    if (child.GetType() != typeof(Label))
        continue;                               // Label型以外は無視

    Label label = child as Label;               // Label型にキャスト

    // 以下labelに対する処理を実行
}

これをLINQ使うと次のようになった。

foreach( Label label in canvas.Children.OfType<UIElement>()    // Cavas.ChildrenをUIElementCollectionからIEnumerable型に変換
    .Where( c => c.GetType() == typeof(Label))                 // Label型の要素だけ抽出
    .OfType<Label>())                                          // Label型のIEnumerableへ変換
{
    // 以下labelに対する処理を実行
}

便宜上foreachの内容を3行に分けたけど、キャストだとか必要な要素の抽出は事前にやっているので、foreachによるループ処理の記述は行いたい処理だけになってすっきりした。ちなみに、Collection型もOfTypeとか使うとIEnumerableになるからLINQが使えて便利だよ!


«前の日記(2013年07月29日) 最新 次の日記(2013年08月15日)» 編集