MENU閉じる

HEXA BLOG

プログラム

HEXA BLOGプログラム2016.12.1

C#のLINQが便利!

シワッスプログラマーの平尾です。

 

今回はプログラマー向けの話です。
C#3.0からLINQという凄い便利な機能が使えるので、簡単に紹介します。

 

LINQで一体何が出来るのかというと、
「コレクションの操作を非常に簡潔に記述すること」
が出来ます。

 

と言われてもLINQを知らない方はピンと来ないと思いますので、
サンプルプログラムを書いてみました。
(LINQはメソッド構文で記述しています)

 

【ソース】

using System;
using System.Linq;    // LINQを使用する際に必要なusing

class Program
{
    public class Data
    {
        public string    name;
        public string    home;
        public int       power;
    }

    static void Main(string[] args)
    {
        // キャラクターデータ
        var src = new Data[]
        {
            new Data { name = "筋肉男", home = "日本",     power = 95   },
            new Data { name = "星肩男", home = "アメリカ", power = 95   },
            new Data { name = "鉄仮面", home = "イギリス", power = 95   },
            new Data { name = "拳法男", home = "中国",     power = 97   },
            new Data { name = "軍服男", home = "ドイツ",   power = 90   },
            new Data { name = "熊爪男", home = "ロシア",   power = 100  },
            new Data { name = "猛牛男", home = "スペイン", power = 1000 },
            new Data { name = "元人間", home = "アメリカ", power = 83   },
        };

        // 名前だけ取り出す
        var dst = src.Select( x => x.name );
        Console.WriteLine("■名前一覧");
        foreach ( var data in dst ) {
            Console.WriteLine("name = {0}", data);
        }

        // パワーが100以上のキャラクターを取得
        var dst2 = src.Where( x => x.power >= 100 );
        Console.WriteLine("\n■パワーが100以上のキャラクター");
        foreach( var data in dst2 ) {
            Console.WriteLine("power = {0, 4}, name = {1}", data.power, data.name);
        }

        // 日本またはアメリカ出身のキャラクター数
        int count = src.Count( x => x.home == "日本" || x.home == "アメリカ" );
        Console.WriteLine("\n■日本/アメリカ出身者数 = {0}人", count);

        // パワーが高い順にソート
        var dst3 = src.OrderByDescending( x => x.power );
        Console.WriteLine("\n■パワーが高い順");
        foreach( var data in dst3 ) {
            Console.WriteLine("power = {0, 4}, name = {1}", data.power, data.name);
        }

        // 出身地でグループ化する
        var dst4 = src.GroupBy(x => x.home, x => x.name );
        Console.Write("\n■出身地別");
        foreach (var group in dst4) {
            Console.Write("\n{0}:", group.Key);
            foreach (var name in group) {
                Console.Write("{0}, ", name);
            }
        }
    }
}

 

【出力結果】

■名前一覧
name = 筋肉男
name = 星肩男
name = 鉄仮面
name = 拳法男
name = 軍服男
name = 熊爪男
name = 猛牛男
name = 元人間

■パワーが100以上のキャラクター
power =  100, name = 熊爪男
power = 1000, name = 猛牛男

■日本/アメリカ出身者数 = 3人

■パワーが高い順
power = 1000, name = 猛牛男
power =  100, name = 熊爪男
power =   97, name = 拳法男
power =   95, name = 筋肉男
power =   95, name = 星肩男
power =   95, name = 鉄仮面
power =   90, name = 軍服男
power =   83, name = 元人間

■出身地別
日本:筋肉男,
アメリカ:星肩男, 元人間,
イギリス:鉄仮面,
中国:拳法男,
ドイツ:軍服男,
ロシア:熊爪男,
スペイン:猛牛男, 

 

プログラム中で以下のように呼び出しているのがLINQクエリです。

src.Where()
src.Select()
src.Count()
src.OrderByDescending()
src.GroupBy()

 

本来ならループして書くところが、とんでもなく簡潔に書けていると思います。
データを取り出す処理はどれも1行
むしろ表示部分の方が長いという…

 

 

この他にも様々な機能が存在していますし、
次のようにLINQクエリを重ねて書くこともできます。

src.Where.().Select()

 

LINQはこのように複雑な処理を簡潔に記述でき、とても便利です

気になった方はネットで詳しい使用方法を検索してみて下さい~

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE