choi linq
TRANSCRIPT
わんくま同盟 http://www.wankuma.com/
業務に役立つちょいLINQ
まさる@わんくま同盟
http://blogs.wankuma.com/masaru/
わんくま同盟 http://www.wankuma.com/
自己紹介
• ハンドル まさる
• 性別 見ての通り♂
• 職業 SE兼プログラマ(業務ではVB、趣味ではC#がメイン)
• 趣味
– 楽器演奏 バスクラリネット
– 読書
• 小説
• 技術書
• ビジネス書
わんくま同盟 http://www.wankuma.com/
詳しくは…
まさるblogでググってくださいませ
<(_ _)>
わんくま同盟 http://www.wankuma.com/
今日は・・・
昨年リリースされた.NET Framework 3.5
その目玉機能であるLINQですが、
新たな概念のため
有効に活用されていません
そんなLINQを実例を交えて紹介します
わんくま同盟 http://www.wankuma.com/
なお・・・
今回はC#の例を紹介します!
VBでもそんなに変わらないので
気後れしなくていいですよ
v(^ ^)v
わんくま同盟 http://www.wankuma.com/
Agenda
• LINQとは?
• LINQの基本
• 便利なLINQ
わんくま同盟 http://www.wankuma.com/
LINQとは?
わんくま同盟 http://www.wankuma.com/
LINQとは?
• LINQ (Language Integrated Query)
日本語訳:統合言語クエリ
– C#、VBなどのプログラミング言語に統合され
た、あらゆるデータを同様の構文で問い合わせ(クエリ)を行う方法
– .NET Framework 3.5に組み込まれた
最強の機能
わんくま同盟 http://www.wankuma.com/
LINQとは?
• LINQの機能
– 様々なデータ集合に対して、以下のような操作を行う
• フィルタリング
• 列挙
• 射影
• etc…
わんくま同盟 http://www.wankuma.com/
LINQとは?
• LINQの種類
– LINQ to Object
– LINQ to DataSet
– LINQ to XML
– LINQ to SQL
– LINQ to Entity
わんくま同盟 http://www.wankuma.com/
LINQとは?
• LINQ to Object
– 様々なコレクションの変数に対するクエリ
• 配列、リスト、など
– 具体的には、IEnumerable<T>インターフェイスを実装する型ならなんでも可能
• IEnumerable<T>の機能は列挙すること
• つまり列挙できるものなら何でも可能ということ
わんくま同盟 http://www.wankuma.com/
LINQの基本
わんくま同盟 http://www.wankuma.com/
LINQの基本
• クエリ構文
– SQLのようなクエリ式でデータを操作
※この例での結果はIEnumerable<string>
int[] values = { 1, 2, 3, 4, 5 };var q = from value in values
where value < 4select String.Format("{0:D6}", value);
foreach (var value in q)Console.WriteLine(value);
わんくま同盟 http://www.wankuma.com/
LINQの基本
• クエリ構文
– 実行結果
わんくま同盟 http://www.wankuma.com/
LINQの基本
• メソッド構文
– メソッドチェーンでクエリを構築
※「value => ~」はラムダ式
int[] values = { 1, 2, 3, 4, 5 };var q = from values.Where(value => value < 4)
.Select(value =>String.Format("{0:D6}", value))
;foreach (var value in q)
Console.WriteLine(value);
わんくま同盟 http://www.wankuma.com/
LINQの基本
• メソッド構文
– WhereメソッドやSelectメソッドの正体は、System.Linq名前空間に定義された、IEnumerable<T>の拡張メソッド
– クエリ式はこのメソッド構文のSyntax Sugar
LINQはこのメソッド群を
いかに上手く使うかが勝負
わんくま同盟 http://www.wankuma.com/
LINQの基本
• クエリ構文とメソッド構文の使い分け
– クエリ構文
• 条件指定、並べ替えなど複合的に行う場合
• 1つの条件でフィルタリングするだけなら、メソッド構文の方が単純
– メソッド構文
• 単一のメソッドで終わるような場合
• 同じラムダ式を複数回書くのが面倒
わんくま同盟 http://www.wankuma.com/
LINQの基本
• クエリ構文とメソッド構文の使い分け
var q = values.Where(value => value < 4 & value % 3 == 0).OrderByDescending(value => value).Select(value =>
String.Format("{0:D6}", value));
var q = from value in valueswhere value < 4 & value % 3 == 0orderby value descendingselect String.Format("{0:D6}", value);
わんくま同盟 http://www.wankuma.com/
LINQの基本
• クエリ構文とメソッド構文の使い分け
var q = values.Where(value => value < 4);
var q = from value in valueswhere value < 4select value;
わんくま同盟 http://www.wankuma.com/
LINQの基本
• LINQで気を付けること
– LINQの中身はあくまで値の列挙とその操作、つまりforeach
– あまり使いすぎるとパフォーマンス悪化の可能性
用法、用量を守って
正しくお使いください
わんくま同盟 http://www.wankuma.com/
便利なLINQ
わんくま同盟 http://www.wankuma.com/
便利なLINQ
• Whereメソッド
– コレクションのフィルタリングを行う
var values = Enumerable.Range(1, 20);
var q = values.Where(value => value % 3 == 0);
わんくま同盟 http://www.wankuma.com/
便利なLINQ
• Any、Allメソッド
– コレクションの項目のいずれか(Any)、もしくは全て(All)が条件を満たすか判定
デモで従来の方法と比較します
string[] values = { "hoge", "foo“, "bar", "piyo", "fuga" };
bool any = values.Any(value =>value.StartWith("h")); // true
bool all = values.All(value =>value.StartWith("h")); // false
わんくま同盟 http://www.wankuma.com/
便利なLINQ
• Sum、Average、Max、Minメソッド
– コレクションの値の総和(Sum)、平均(Average)、最大値(Max)、最小値(Min)を求める
デモで従来の方法と比較します
var values = Enumerable.Range(1, 20);
var sum = values.Sum();var avg = values.Average();var max = values.Max();var min = values.Min();
わんくま同盟 http://www.wankuma.com/
便利なLINQ
• OrdayBy、OrderByDescendingメソッド
– コレクションを並び替えて取得する
デモで従来の方法と比較します
var values = new Person[] {new Person{ Name="Taro", Age=23 }, new Person{ Name="Jiro", Age=17 }, new Person{ Name="Hanako", Age=21 }, new Person{ Name="Kaoru", Age=15 }
};
var orderByName = values.OrderBy(value => value.Name);
var orderByAgeDescending = values.OrderByDescending(value => value.Age);
わんくま同盟 http://www.wankuma.com/
便利なLINQ
• Reverseメソッド
– コレクションを逆順に取得する
デモで従来の方法と比較します
var values = Enumerable.Range(1, 20);
var reverseValues = values.Reverse();
わんくま同盟 http://www.wankuma.com/
便利なLINQ
• GroupByメソッド
– コレクションをグルーピングする
デモで従来の方法と比較します
var values = new Sales[] { new Sales { ProductId = 1, SalesQty = 10 }, ~ };
var groupedValues = values.GroupBy(value => value.ProductId);
foreach (var group in groupedValues){Console.WriteLine("■ProductId : {0}", group.Key);int TotalSalesQty = group.Sum(value => value.SalesQty);foreach(var value in group){Console.WriteLine(value);
}}
わんくま同盟 http://www.wankuma.com/
便利なLINQ
• ToArray、ToList、To~メソッド
– コレクションをTo~で指定された型に変換する
デモで従来の方法と比較します
var values = Enumerable.Range(1, 20);
List<int> intList = values.ToList();int[] intArray = values.ToArray();
わんくま同盟 http://www.wankuma.com/
まとめ
わんくま同盟 http://www.wankuma.com/
まとめ
• LINQにはクエリ構文、メソッド構文があり、適宜使い分ける
• LINQの中身はforeach
• LINQを使うことで、従来よりも遥かに短いコードで、しかもわかりやすくコレクションを扱える
そして何よりも・・・
わんくま同盟 http://www.wankuma.com/
LINQ 超便利!ぜひ使うべき!
わんくま同盟 http://www.wankuma.com/
おしまい!
ご静聴ありがとうございました<(_ _)>