2016年6月5日日曜日

[C#] LINQ(リンク)-1

こんにちは。明月です。
今日はC#ののLINQについて勉強します。


プログラムを開発するとList(リスト),Map(Dictionary)などをたくさん使うと思います。例えば仕様によって同じタイプのデータをリスト化にして実装するほうが実装が綺麗にできるし、ソース整理が楽だと思います。




前の投稿でもListについて勉強したことがあるので上の例を解析ができると思います。そうすれば上の「number」の「2」を検索するようにはどうしましょうか?一般的にはループで分岐文を付け入れて検索します。




上の例はデータ複雑度が低いので簡単に実装ができますが、クラスのデータが複雑だし、量が多い場合は実装も大変になるし、データ処理時間も結構かかると思います。


LINQ


その場合があるとデータベースのクエリみたいに簡単に検索ができるのがあればいいと思われますね。それで「.Net Framework3.5」からリスト、ディクショナリをSQLクエリみたいなキーワードで簡単に検索ができるように「LINQ」ということを提供しています。




上の例を見ると「getSearch2」のメソッドの中でSQLクエリみたいな「from」、「where」、「select」のキーワードがあります。結果は「getSearch」と同様に「Number」を検索して「Data」の値を返却します。


そうすると「LINQ」のキーワードについて詳しく勉強しましょう。


LINQキーワード 説明
from〜in 検索するリストあるいはディクショナリ、データテーブルを指定
where リストを検索する条件
join 2つ以上のデータリストを結合
orderby 結果のデータリストの整列
group 結果のデータリストのグループ化
select 結果データを抽出

Linqの場合は上のキーワードを使ってリストを検索をします。そして検索した後のデータはただのリストを返却することではなく「IEnumerable」タイプで返却しますね。
「IEnumerable」は「yield」のキーワードを勉強する際に説明したことがあります。


[C#] indexer(インデクサー)とyield(リファレンス)


もう1回説明すると「IEnumerable」は「interator」パターンと関係があるクラスです。「IEnumerable」のタイプからデータ取得方法は「IEnumerator」に変換することや、「ToList」メソッドを使ってリストタイプに返却することや、「ToArray」メソッドを使って配列で取得することや、また結果の値が1つの場合に「ToSingle」のメソッドで単一結果を取得する方法があります。




今まで「LINQ」の基本文法について勉強しました。上の例をみると2つのリストを「Join」キーワードで結んでデータ処理しています。それをただのループで実装すると思えばソースが複雑度がかなりあがると思いますね。
C#「LINQ」はデータをSQLクエリみたい扱う方法だけあることではないけど、上の例だけみても「LINQ」を使うと実装が簡単になることを確認できますね。
上の形式はリンクのSQLクエリ文法ですが、次の投稿ではメソッドタイプの「LINQ」について勉強します。

0 件のコメント