この記事はLINQってこんな感じのものだよという説明になります。
早く使い方を知りたいという方はこちらを見てください。
LINQとは?
LINQ(リンクと読む)はLangage INtegrated Queryの略で、統合言語クエリというらしいです。日本語になってもよくわかりませんね。
気を取り直して、LINQを使って出来るのは、順番に並んだデータの集まりからデータを抽出したり、集計したりすることができます。
あるデータに対して検索したり、集計したりという命令をクエリ(Query)といいます。
対象とするデータの集まり(データソース)が何かによって、いくつか呼び方があります。
呼び方 | 対象のデータソース |
---|---|
LINQ to Objects | コレクション(IEnumerableを実装したオブジェクト) |
LINQ to Dataset | データセット(System.Data.DataSet) |
LINQ to SQL | RDB(リレーショナルデータベース) |
LINQ to XML | XML |
LINQ to Entities | Entity 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# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント