Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

なにができるの?

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について最初勘違いしてまして、
「リストを検索して条件判断して、処理までできるんじゃないか」と。

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

m-gen
てきとうなプログラマー。 C++を得意ともいえず、Cも少しやってC#は楽だなぁとPythonはもうちょっとなにか欲しいJavaScriptのごちゃごちゃに少し慣れてきたところ。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした