19
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LINQとラムダ式ってなにができるの?

Last updated at Posted at 2015-09-29

調べども、「便利だ」「こう使え」ってばかりで、
なにをするものか、理解に苦しんだので、簡単にまとめてみたい。

なにができるの?

LINQ

(1). 1つ以上のリストから1つのリストを再構成する ※ここでLINQを使う
(2). 再構成したリストを処理する

ラムダ式

「引数 => どうする?」という書式
関数の設定が必要なとき、関数と引数をひも付けて設定できる

いきなり サンプル

本文1
// 文字の配列をスペースで前後に分けて、手前がAのものだけコンソールに出力する
string[] list_src = { "A A-1", "A A-2", "B B-1", "A A-100", "C C-9999" }; 
var list_dest = list_src.Where( p1 => IsA(p1) ); // (1)とラムダ式

// 以下(2)
foreach (string s in list_dest)
{
    Console.WriteLine(s);
}
本文2・関数を定義しておく
bool IsA(string p)
{
    return p.Split(' ')[0] == "A";
}
出力結果
A A-1
A A-2
A A-100

ラムダ式をさわってからLINQを見たほうがいいのだけど、私は順序を間違えてラムダ式の含まれたLINQのサンプルに出会って困惑しました。

上のサンプルもそうだが、ラムダ式から見ていったほうがいい。

ラムダ式の概要

「関数の設定が必要なとき、関数と引数をひも付けて設定できる」
を、細かく見ていく。

「関数の設定が必要なとき」は...

  • ボタンが押されたとき
  • テキストボックスの内容が変更されたとき
  • ソートなどで手作りの比較関数が必要なとき
  • LINQでリストの再構成の関数が必要なとき

「関数の設定が必要なとき」を自前で作ることもできる。

そういったときに、引数 => どうする?、という形で書くことができる。

p1 => IsA(p1)

この場合
p1という引数が呼ばれるから
IsA関数の1つめの引数にp1をわたしてくれ
となる。

前半について
「関数の設定が必要なとき」に使うものだから、つまり、予め決まっている引数があり、それをp1である、という事を示している。

引数が複数の場合

(p1, p2) => IsA(p1,p2)

このように、引数の複数にしたり、直接中身を書き始めると、どんどんオバケみたいになるものの、「引数の明示 => どうする?」と見分けるのが重要らしい。

LINQ そもそもいらない?

リストの要素を再構成(抽出)するときに、処理を書いてしまえばいいのではないか?

string[] list_src = { "A A-1", "A A-2", "B B-1", "A A-100", "C C-9999" };

foreach( string s in list_src )
{
    string[] splitS = s.Split(' ');
    if (splitS[0] == "A" )
    {
        Console.WriteLine(splitS[1]);
    }
}

処理速度やぱっとみで、この方が理解しやすそうだ。
いったん別にリストを構成するなんて無駄に思える?

リストの再構成(抽出)が複雑になるほど、
その結果で行うことが複雑になるほどほど、
foreachの中身は混沌としていく。

だから、役割分担をし、コードを分離する。
ここが分かっていないと、複雑になってないか?とメリットがみいだせない。

実際、サンプルを比較すると、
LINQを使わないほうが読みやすい。

それは、全体が小さく、順をおって処理が読めるから。

すこしサンプルの説明をしておくと、

var list_dest = list_src.Where( p1 => IsA(p1) ); // (1)とラムダ式

ここでは、list_destというリストを新しく構成宣言している。
その実際に使うとき、list_srcの中から欲しいものを探してくる。
~.Where( boolが戻り値の関数 );
で、欲しいものを探してくれて、関数は、ラムダ式で設定している。
※「実際に使うとき」というのは foreach (string s in list_dest)

LINQは、foreachが使えるなら配列でも可能で、
Where以外にもいろいろあるみたい。

ひとりごと

実はLINQについて最初勘違いしてまして、
「リストを検索して条件判断して、処理までできるんじゃないか」と。

良い記事・ページに当たらなかっただけかもしれませんが...

19
18
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?