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

実行環境

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

delagateに関してこちらから。

【C#】delegate

2021.02.15

匿名メソッドとは

匿名という名前の通り、「メソッドを別で定義せずに使えるよ」ということです。
delegateのみで実装する際には、メソッドを別で作らなければいけませんでした。
しかし、匿名メソッドを使用すれば別にメソッドを作る必要がありません。

 

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

xaml側にボタンを1つ作ります。

<Button Content="Button5"
  Command="{Binding Button5Command}"
  Height="30"
  Width="50">
</Button>

次に、ViewModel側にButton5の処理を書きます。

/* コンストラクタ */
public MainWindowViewModel()
{
  Button5Command = new DelegateCommand(Button5CommandExecute);
}

delegate bool LengCheck(string value);        

/* 前回使った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 Button5Command { get; }

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

実行。

Button5を押下すると、要素数が4の「ええええ」が表示されます。
下記の部分が匿名メソッドになります。

var values = new string[] { "あ", "いい", "ううう", "ええええ", "おおおおお" };
var result = GetValue3(
  values,
    /* これが匿名メソッド */
    delegate (string value)
    {
      return value.Length == 4;
    });


/* 匿名メソッドなしで実装(前回までの実装) */
var values = new string[] { "あ", "いい", "ううう", "ええええ", "おおおおお" };
var result = GetValue3(values, Method1)
Console.WriteLine(string.Join(",", result));

private bool Method1(string value)
{
  return value.Length == 4;
}

delagateでは、別でメソッドを用意する必要がありました。
しかし、匿名メソッドを使用すれば、処理を書き込めるようになります。

 

Predicateとは

Predicateは、引数について処理を行った結果のbool値を返します。
Predicateが事前にdelegateを用意してくれているイメージです。

今まではdelegateを使うために下記のコードを書かなければいけませんでした。

delegate bool LengCheck(string value);

Predicateを使用すれば、このdelegateを書かなくてよくなります。
実際にコードを書いていきます。
xaml側にButton6を用意します。

<Button Content="Button6"
                Command="{Binding Button6Command}"
                Height="30"
                Width="50">
            </Button>

次に、ViewModel.csにButton6の処理を書いていきます。

/* コンストラクタ */
public MainWindowViewModel()
{
  Button6Command = new DelegateCommand(Button6CommandExecute);
}

public DelegateCommand Button6Command { get; }
private void Button6CommandExecute()
{
  var values = new string[] { "あ", "いい", "ううう", "ええええ", "おおおおお" };
  var result = GetValue6(
      values,
      delegate (string value)
      {
        return value.Length == 3;
       }
       );
   Console.WriteLine(string.Join(",", result));
}

/* Predicateを使えば、delegate bool LengCheck(string value)がいらなくなる */

/* 引数をPrediceteに変更 */
private string[] GetValue6(string[] values, Predicate<string> predicate)
{
  var result = new List();
  foreach (var val in values)
  {
    /* predicateに変更 */
    if (predicate(val))
    {
      result.Add(val);
    }
  }
  return result.ToArray();
}

実行。

Button6を押下した際に、要素数が3つの「ううう」が表示されました。
このように、Predicateを使うことでdelegateを省略することができます。

以上が匿名メソッドとPredicateの使い方になります。