PR

[C# 入門] LINQってなに?LINQでできること

この記事はLINQってこんな感じのものだよという説明になります。
早く使い方を知りたいという方はこちらを見てください。

スポンサーリンク

LINQとは?

LINQリンクと読む)はLangage INtegrated Queryの略で、統合言語クエリというらしいです。日本語になってもよくわかりませんね。

気を取り直して、LINQを使って出来るのは、順番に並んだデータの集まりからデータを抽出したり、集計したりすることができます。

あるデータに対して検索したり、集計したりという命令をクエリ(Query)といいます。

対象とするデータの集まり(データソース)が何かによって、いくつか呼び方があります。

呼び方対象のデータソース
LINQ to Objectsコレクション(IEnumerableを実装したオブジェクト)
LINQ to Datasetデータセット(System.Data.DataSet)
LINQ to SQLRDB(リレーショナルデータベース)
LINQ to XMLXML
LINQ to EntitiesEntity Framework

とくに配列やコレクションはコードを書くときに必ずと言っていいほど使うので、LINQ to Objectsが大活躍します。

そしてLINQはいろんなデータソースに対して検索、集計などの命令を共通のメソッドで書くことができます。

代表的なのはこんな感じです。

命令LINQの機能(メソッド)
データソースの各項目(要素)から必要な項目だけをとりだす。
また、取り出す際に要素を加工する
Select
データソースから条件に一致したデータを抽出するWhere
データを並び替えるOrderBy
キーを指定してデータをグループ化するGroupBy
各項目(要素)の合計を集計するSum

LINQを使ってデータソースから抽出したり、グループ化したりした結果のデータをシーケンス(連続した、一続きのデータという意味)といいます。

スポンサーリンク

LINQのメソッドの特徴

LINQのメソッドにはいくつか特徴があります。

引数にデリゲート型(つまりメソッド)を指定するメソッドがある

Select、Whereメソッドなどがそれにあたります。
Selectメソッドには各要素を加工するメソッド、
Whereメソッドには条件を判定するメソッドを指定します。

メソッドを引数で指定することで自由に処理を決めることができます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // データソース
        List<int> list = new List<int> { 1, 2, 3, 4, 5 };

        // Selectメソッドを実行
        var add100_list = list.Select(i => i + 100);
        Console.WriteLine($"Select結果=[ {string.Join(", ", add100_list) } ]");

        // Whereメソッドを実行
        var filter_list = list.Where(i => i % 2 == 0);
        Console.WriteLine($"Where結果=[ {string.Join(", ", filter_list) } ]");
    }
}
Select結果=[ 101, 102, 103, 104, 105 ]
Where結果=[ 2, 4 ]

引数に渡すメソッドはラムダ式を使い匿名関数を渡すことが多いです。
ラムダ式?という方は、[C# 入門] 匿名関数(ラムダ式)の使い道を見てください。

メソッドをつなげて記述できる(メソッドチェーン)

メソッドをつなげて記述することができます。たとえば、Whereメソッドで条件に一致したデータを抽出した後にSelectメソッドで必要な項目だけを取り出す、なんてことができます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // データソース
        List<int> list = new List<int> { 1, 2, 3, 4, 5 };

        // WhereしてSelectする
        var reslut = list.Where(i => i % 2 == 0).Select(i => i + 100);
        Console.WriteLine($"WhereしてSelectした結果=[ {string.Join(", ", reslut) } ]");
    }
}
WhereしてSelectした結果=[ 102, 104 ]

遅延評価されるものがある

式(命令)が実行されることを評価といいます。
遅延評価とはその命令(メソッド)の結果が必要になるまで実行されないということです。

Selectメソッド、Whereメソッドなど戻り値がデータの集まり(IEnumerable型)になるものはだいたい遅延評価になります。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // データソース
        List<int> list = new List<int> { 1, 2, 3, 4, 5 };

        // Selectメソッドを実行
        var add100_list = list.Select(i => i + 100);

        // データソースにデータを追加
        list.Add(6);
        list.Add(7);

        // さて結果は、、、
        Console.WriteLine($"Select=[ {string.Join(", ", add100_list)} ]");
    }
}
Select=[ 101, 102, 103, 104, 105, 106, 107 ]

上のサンプルでは12行目でSelectメソッドの記述がありますが、実際に実行されたのは19行目ということになります。
これを忘れていると思ったようにデータが取り出せないので注意が必要です。

なんでこんなことが必要と思うかもしれませんが、その方が効率的だかららしいです。


C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント