【C#】ラムダ式

実行環境

■Windows10
■Visual Studio Community 2019
■WPF(Prism Blank App)

delegateと匿名メソッド・Predicateに関しては下記の記事をご覧ください。

【C#】delegate

2021.02.15

【C#】匿名メソッド・Predicate

2021.02.16

 

ラムダ式とは

ラムダ式とは、匿名メソッドを簡略化した記載法です。

 

ラムダ式の書き方

/* 匿名メソッド */
delegate (string value)
{
  return value.Length == 4;
}

/* 上記をラムダ式で書くと以下になる */
value => value.Length == 4;

匿名メソッドよりも、可読性・可視性が上がります。

ラムダ式のポイント

ラムダ式のポイントは、=> (ゴーズ・トゥ)でラムダ演算子と呼ばれるものです。
左辺がパラメータ(上記ではvalue)で右辺が式(上記ではvalue.Length)になります。
左辺と右辺の書き方を詳しくみていきます。

左辺
ポイント①

匿名メソッドでは、delegate(string value)のように、パラメータの型を書く必要がありました。
しかし、ラムダ式では省略することができます。

ポイント②
パラメータの数に合わせて、下記のように書き方が少し異なります。

/* パラメータがない場合 */
() => Console.Write("アイウエオ");

/* パラメータが1つの場合 */
value => value.Length == 4

/* パラメータが2つの場合 */
(value, leng) => value.Length == 1 + leng

右辺
ポイント①
右辺が式のみの場合は、returnは不要。

ポイント②
右辺に処理(if文など)がある場合には、returnが必要。

 

匿名メソッドのソースコード

まずは、匿名メソッドを使って実装していきます。
下記のように、Buttonをxaml側に用意します。

<Button Content="Button7"
        Command="{Binding Button7Command}"
        Height="30"
        Width="50">
</Button>

続いて、ViewModel側に処理を書いていきます。

/* コンストラクタ内 */
public MainWindowViewModel()
{
  Button7Command = new DelegateCommand(Button7CommandExecute);
}

/* 前回使ったGetValue3メソッド */
private string[] GetValue3(string[] values, LengCheck lengCheck)
{
  var result = new List<string>();            
  foreach (var val in values)
  {
    if (lengCheck(val))
    {
      result.Add(val);
    }
  }
  return result.ToArray();
 }
public DelegateCommand Button7Command { get; }

private void Button7CommandExecute()
{
  var values = new string[] { "あ", "いい", "ううう", "ええええ", "おおおおお" };
  var result = GetValue3(
      values,
      /* 匿名メソッド */
      delegate (string value)
      {
        return value.Length == 4;
      }
      );
  Console.WriteLine(string.Join(",", result));
}

実行。

Button7を押下すると、コンソールに「ええええ」が表示されています。
ここまでが匿名メソッドを使ったものです。
次に上記をラムダ式に変換していきたいと思います。

ラムダ式のソースコード(匿名メソッドをラムダ式に変換)

private void Button7CommandExecute()
{
  var values = new string[] { "あ", "いい", "ううう", "ええええ", "おおおおお" }; 
 /* 匿名メソッドをラムダ式に変換 */
  var result = GetValue3(values, value => value.Length == 4);
  Console.WriteLine(string.Join(",", result));
}

実行すると、先程と同様に要素数が4つの「ええええ」がコンソール上に表示されます。
これがラムダ式の基本的な書き方になります。

 

【補足】FuncとActionとは?

.NET Framework3.0からFuncとActionが登場しました。
この機能により、delegateを一切書かずに済むようになりました。
Funcは戻り値ありで、Actionは戻り値がありません。

実際にdelegateとの違いをみていきます。

/* delegate */
delegate bool LengCheck4(string value, int leng);

/* Func */
Func<string, int, bool> LengCheck4

続いて、Actionをみていきます。

/* delagate */
delegate void LengCheck5(string value)

/* Action */
Action<string>

このようにdelegateはFuncとActionで書けるようになっています。
最後にもう少し、ラムダ式の書き方をみていきます。

ラムダ式の書き方①(コレクション)

まずは、Buttonをxaml側に1つ用意します。

<Button Content="Button16"
        Command="{Binding Button16Command}"
        Height="30"
        Width="60">
</Button>

続いてViewModelにButtonを押下した後の処理を書きます。

/* コンストラクタ内 */
public MainWindowViewModel()
{
  Button16Command = new DelegateCommand(Button16CommandExecute);
}

public DelegateCommand Button16Command { get; }

private void Button16CommandExecute()
{
  var values = new string[] { "あいうえお", "ああああ", "いいいい", "うううう", "えええ" };
}

Buttonを押下した際の処理を書きます。

public DelegateCommand Button16Command { get; }

private void Button16CommandExecute()
{
  var values = new List<string> { "あいうえお", "ああああ", "いいいい", "うううう", "えええ"};

  var result1 = values.Find(x => x.Contains("い"));
  Console.WriteLine("result1:" + string.Join(",", result1));

  var result2 = values.FindAll(x => x.Contains("い"));
  Console.WriteLine("result2:" + string.Join(",", result2));
}

実行。

Button16を押下すると、コンソール上にラムダ式を使った処理の結果が表示されています。

ラムダ式の書き方②(カスタムクラス)

先程と同様にButtonを追加します。

public DelegateCommand Button17Command { get; }

private void Button17CommandExecute()
{
  var items = new List<Item>();
  items.Add(new Item(1, "i1"));
  items.Add(new Item(2, "i2"));
  items.Add(new Item(3, "i3"));

  var result1 = items.Find(x => x.ItemId == 2);
  Console.WriteLine("result1:" + string.Join(",", result1.ItemName));
}

/* 任意のカスタムクラスを用意 */
public class Item
{
  public Item(int itemId, string itemName)
  {
    ItemId = itemId;
    ItemName = itemName;
  }
  
  public int ItemId { get; }
  public string ItemName { get; }
}

実行。

Button17を押下すると、ItemクラスのItemNameがコンソール上に表示されました。
カスタムクラスに対してはこのようにラムダ式を書いていきます。