2
5

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 3 years have passed since last update.

なんと便利なラムダ式

Posted at

#なんと便利なラムダ式
##はじめに
 この断りを書かないと怒られそうなので。
 「今回紹介するのはラムダ式のごく一部です」
 ラムダ式、クエリ式に興味を持ってもらえたらいいな~という程度です。自分が使っていて便利だなと感じた場面をいくつか紹介しようと思います。何卒御容赦下さい。ちなみに言語はC#です。

##ラムダ式・クエリ式とは
 ラムダ式・クエリ式とは、本来ならば関数を定義するところを簡単に1行で書けたり、配列を直感的に操作できるすごい奴だよ。
 ラムダ式・クエリ式とまとめて書きましたが、今回紹介するのはラムダ式のみになります。
 正直ラムダ式紹介するだけでも知らない方からすれば結構楽しんでもらえると思います。自分自身初めて触れたときには「プログラミングって案外ラフなんだなー」と感心したものです。

##ラムダ式の書き方
 基本的にラムダ式と言うと=>->といった矢印が用いられていることが多いです。(もしかしたら他にも記法があるのかも?)
 一般的にプログラミングの関数はC++ならint function()Pythonではdef function()等、名前をはじめに決めて処理を内部に書くことが基本ですが、簡単な関数、ましてや1度や2度しか使わない関数にも同様に名前を付けて使わなければならない場面があったりします。しかしと言うかやはりと言うかモブみたいな関数に一丁前に名前を付けて主役級の関数と同じ扱いをするのは疲れてくるわけです。
 そこでいよいよ登場**「ラムダ式」となるわけですが、ラムダ式はDelegateActionといった匿名関数(無名関数)の延長線なので、詳しく知りたい方は調べてみると面白いかもしれません。繰り返しになりますが本ページでは「ラムダ式のごく一部」**しか紹介しませんので悪しからず。

##実際に書いてみよう
###簡単な例
####ソースコード

using System;
using System.Linq;

class Program {
    static void Main(string[] args) {
        string str = "Hello World";
        //for-each
        Console.WriteLine("for-each");
        foreach(string s in str.Split(' ')) {
            Console.WriteLine(s);
        }
        Console.WriteLine("");
        Console.WriteLine("lambda");
        //ラムダ式
        str.Split(' ').ToList().ForEach(s => Console.WriteLine(s));
    }
}

####実行結果

for-each
Hello
World

lambda
Hello
World

 **「文字列"Hello World"を空白で分割してそれぞれ配列に格納して各要素を出力する」**ということをforeach=>でそれぞれ書いてみました。言わずもがなforを使うこともできますが、その場合は少しだけforeachに比べて書く文字数が多くなります。
 ForEach()を使うと怒られるかもしれませんが、これはあくまで簡単な例ということで。(ForEach()はラムダ式を用いる、つまりDelegateを生成している分、単純なforforeach等よりもリソースを食う可能性がある。)

###実用的な例
####ソースコード

using System;
using System.Linq;

class Program {
    static void Main(string[] args) {
        string str = "0, 1, 2, 3, 4, 5, 6, 7, 8, 9";
        //for-each
        Console.WriteLine("for-each");
        //文字列型配列の宣言と初期化
        string[] strArray = str.Split(',');
        //整数型配列の宣言
        int[] num_foreach = new int[strArray.Length];
        //インデックス変数の宣言と初期化
        int i = 0;
        //整数型配列の代入
        foreach(string s in strArray) {
            num_foreach[i] = int.Parse(s);
            i++;
        }
        //整数型配列の各要素の出力
        foreach(int n in num_foreach) {
            Console.WriteLine(n);
        }

        //ラムダ式
        Console.WriteLine("");
        Console.WriteLine("lambda");
        //文字列の分割からの整数型配列の宣言と初期化
        int[] num_lambda = str.Split(',').Select(s => int.Parse(s)).ToArray();
        //整数型配列の各要素の出力
        foreach(int j in num_lambda) {
            Console.WriteLine(j);
        }
    }
}

####実行結果

for-each
0
1
2
3
4
5
6
7
8
9

lambda
0
1
2
3
4
5
6
7
8
9

 **「csv形式のファイルから数値を配列に格納する」**プログラムです。これはセーブデータの外部ファイルへの保存等応用の幅は広いと思います。上記の出力の部分に関してはあえて別途書きましたが、書く文字数はそれを差し引いても圧倒的な差があることがわかると思います。あとはラムダ式のほうが視線を縦に動かさずに済むのでそういった意味では可読性も高いかもしれません。自分の場合はラムダ式を用いた方が楽で何をやっているのか見やすいので使う機会が多いですね。

##さいごに
 ラムダ式やクエリ式等はあくまでも楽に書くための補佐的文法でしかないので、基本的な文法でもあらゆることが代替可能ではありますが、開発の際の時間、文字数、人材等のリソースの無駄な部分がカットできる可能性がありますので、「一度しか使わない代入のためだけの関数がバグの原因っぽいけど関数作りすぎてどの辺にあったかわかりづらい」や「配列を操作するのにわざわざfor文で操作するの面倒くさい」等痒い所に手が届く仕組みがLinqには備わっているので、ぜひリファレンスや他の記事を一読してみるのもいいかもしれません。

2
5
0

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
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?