C# ラムダ式(Lambda)を解説(基本)

C#

C#を学習してたくさんの人が行き詰るラムダ式。
書き方が急に変わったり考え方そのものが違うので、たくさんの人が目を背けてしまいがちですが
理解してしまえば決して難しいものではありません。

それでは早速、
ループ処理を例にラムダ式について解説していきます。

ループ処理のfor、foreach

private List itemList = new List
{
    "AAA","BBB","CCC","DDD","EEE"
};

例として
いくつかの文字列が格納されたListがあり、
Listの要素1つ1つの文字列の長さを格納したリストを作成する
といった処理を実装するとします。

forやforeachではこのような実装になります。

for文

List editedList = new List();
for (int i = 0; i < itemList.Count; i++)
{
    editedList.Add(list[i].Length);
}

foreach文

List editedList = new List();
foreach (string str in list)
{
    editedList.Add(str.Length);
}

これらは皆さんがよく使用するおなじみのforやforeachです。

ラムダ式でループ処理を実装する

では、早速このループ処理をラムダ式に置き換えてみます。
今回はSelectメソッドを使って説明していきます。

まずはラムダ式の前にメソッド引数から

private List itemList = new List
{
    "AAA","BBB","CCC","DDD","EEE"
};

public void Exec()
{
    var editedList = itemList.Select(AddText).;
}

// Selectメソッドに渡すメソッド
private int AddText(string arg)
{
    return arg.Length;
}

上記のコードを見てみると、
Selectメソッドの引数にメソッドそのものを渡しているのが分かるでしょうか。
itemListの型はListなので、
Selectメソッドはリストの要素分、引数で渡したメソッドを実行します。
また、stringしか入らないリストということがジェネリックによって保障されています。
よって、AddTextメソッドの引数はstringとなります。

メソッド引数をラムダ式に置きかえる

メソッドを引数で渡すにしても、1行程度の処理の為にメソッドを作るのは馬鹿らしいですよね。
そんな時、こんな書き方に置き換えることができます。

private void Exec()
{
    var editedList = itemList.Select((string arg) => { return "000_" + arg; });
}

AddTextメソッドで行っていた処理をメソッド内に直接書きます。
これがラムダ式です。
普段よく見るラムダ式はもっとシンプルだけど?って思った方もいらっしゃいますかね。

実は、ラムダ式は様々な記述を省略できます。
実際に省略してみます。

// 何も省略してないラムダ式
var editedList = itemList.Select((string arg) => { return "000_" + arg; });

 ↓

// ジェネリックにより型が保障されているため、引数の型が省略できる
var editedList = itemList.Select((arg) => { return "000_" + arg; });

 ↓

// {} とreturn も省略できる
var editedList = itemList.Select((arg) => "000_" + arg);

 ↓

// 引数のカッコ()も省略できる
var editedList = itemList.Select(arg => "000_" + arg);

ラムダ式の使い方を理解する

先ほどの例で、ラムダ式はメソッドを渡していることと同じだということを説明しました。
同じ考え方でこんなこともできます。

以下は、コレクションのリストをFor文でループさせ、ひとつずつ出力する。
というロジックです。

foreach (string str in itemList )
{
  Console.WriteLine(str);
}

結果:

AAA
BBB
CCC
DDD
EEE

このロジックをLinqに置き換えると以下のようになります。(メソッド渡し)

private void Action01()
{
  list.ForEach(OutputText);
}

private void OutputText(string arg)
{
  Console.WriteLine(arg);
}

さらに、ラムダ式に置き換えます。

private void Action02()
{
  list.ForEach(arg => Console.WriteLine(arg));
}

ForEachの引数に処理そのものを定義します。

ラムダ式まとめ

非常にシンプルなパターンでのサンプルで解説しましたが
なんとなくイメージできたでしょうか。
結局のところ、実際にコーディングでラムダ式を使ってみる。というのが
理解するための一番の近道だと思います。
最初は実装に時間がかかるかもしれませんが、
なぜそう動くのかを考えながら実装すれば徐々に理解できるようになってきます。

コメント

タイトルとURLをコピーしました