Action、Funcの使い方
こんばんは、サルモリです。
今回は下記のテーマについて解説します。
今回のテーマ
ActionとFunc型について
Func型とAction型を覚えると、ラムダ式の代入がデリゲートを使用するよりもかなり楽になりますので、使い方を絶対に覚えましょう。
今回の記事は下記の記事の続きなので、まだ見ていない方は良ければみてください。
CHECK
-
【C# sharp】匿名メソッド、ラムダ式(=>)について解説します。
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 まえがき こ ...
続きを見る
他のLinqの記事についてはこちら
デリケートの宣言について
前回の記事ではラムダ式について解説し、デリゲート型の呼び出し元を簡潔に記述することができました。
以下にソースコードを記述します。
ラムダ式を使用した処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { int[] array = new int[10] { 2, 3, 1, 5, 4, 6, 3, 1, 3, 4 }; Calc calc = new Calc(); Console.WriteLine(calc.Count(array, n => n % 2 == 0)); Console.WriteLine(calc.Count(array, n => n % 2 == 1)); } } class Calc { public delegate bool Judgement(int value); public int Count(int[] array, Judgement judge) { int count = 0; foreach (var n in array) { if (judge(n) == true) count++; } return count; } } } |
result
4
6
呼び出し元はラムダ式を使用してすっきりしています。
でも、呼び出し先はどうでしょう。ラムダ式を使用する度に、デリゲートをわざわざ宣言するのはめんどくさいですよね。
そこで、今回はFunc型とAction型というものを使用します。
この例ではFunc型を使用しますが、後ほどAction型も説明するので、安心してください。
Func型にして、デリゲートの宣言を省略しよう
早速、上記のソースコードをFunc型にします。
Func型にした例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { int[] array = new int[10] { 2, 3, 1, 5, 4, 6, 3, 1, 3, 4 }; Calc calc = new Calc(); Console.WriteLine(calc.Count(array, n => n % 2 == 0)); Console.WriteLine(calc.Count(array, n => n % 2 == 1)); } } class Calc { public int Count(int[] array, Func<int,bool> judge) { int count = 0; foreach (var n in array) { if (judge(n) == true) count++; } return count; } } } |
result
4
6
18行目をみてください。Judgement型をFunc型に指定するだけです。Func型であれば、デリゲートを使用して宣言する必要もありません。
ルールとして、<>に引数と戻り値の型をそれぞれ指定してあげましょう。
今までデリゲートで宣言する必要があった型を簡単に使えるようにしたのがFunc型と思ってください。
Action型とFunc型
上記の例では、Func型を使用しましたが、Action型も同じように使います。
それぞれ下記のように使い分けます。
Action:戻り値がないラムダ式(メソッドでいうvoid型)
Func:戻り値があるラムダ式(メソッドでいうvoid型以外)
void型が返り値のメソッドだけはFunc型に入れることが出来なかったので、別にAction型というものが出来たんですね。
これからはそれぞれ簡単な例を示していきます。
Action型の使い方
今回の例では、処理の動きを理解してもらうためにラムダ式を使わない例も記述していきます。
ラムダ式を使用しない例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { showtext("rockman", "roll"); showtext("dog", "cat"); showtext("train", "car"); } private static void showtext(string message1,string message2) { Console.WriteLine(message1 + " and " + message2); } } } |
result
rockman and roll
dog and cat
train and car
二つのメッセージを結合して出力するだけの簡単な処理です。
続けて、ラムダ式を使用した例を見てみましょう。
ラムダ式を使用する例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { Action<string, string> showtext = (string message1, string message2) => Console.WriteLine(message1 + " and " + message2); showtext("rockman", "roll"); showtext("dog", "cat"); showtext("train", "car"); } } } |
result
rockman and roll
dog and cat
train and car
ラムダ式を使用すれば、上記のように書くことができます。String型の引数をActionに指定してあげて、出力処理をラムダ式に記述するだけです。
Action型は戻り値がないので、引数の数だけ型を指定すれば大丈夫です。
Func型の使い方
続けて、Func型の使い方を見てみましょう。Actionで説明したメソッドは返り値がありませんでしたが、Func型では、返り値が変えるようにするメソッドを作成することができます。
ラムダ式を使用しない例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { Console.WriteLine(showtext("rockman", "roll")); Console.WriteLine(showtext("dog", "cat")); Console.WriteLine(showtext("train", "car")); } private static string showtext(string message1, string message2) { return message1 + " and " + message2; } } } |
result
rockman and roll
dog and cat
train and car
二つの引数を結合して返すだけの簡単なメソッドですね。
続けて、ラムダ式を使用した例を見てみましょう。
ラムダ式を使用する例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { Func<string,string,string> showtext = (string message1, string message2) => message1 + " and " + message2; Console.WriteLine(showtext("rockman", "roll")); Console.WriteLine(showtext("dog", "cat")); Console.WriteLine(showtext("train", "car")); } } } |
result
rockman and roll
dog and cat
train and car
ラムダ式を使用すると、上記のようなソースコードとなります。Func型は返り値の型も指定してあげることを忘れないようにしましょう。
今回の場合は二つのString型の引数と戻り値のString型を合わせて、3つのString型を指定しています。
まとめ
今回の記事では、ラムダ式を使用する上で、Action型とFunc型を使用する方法を紹介しました。
これらのメソッドを使えるようにすると、ラムダ式を自由自在に使うことができるので、覚えておきましょう。
因みにラムダ式を使う場面とメソッドを使う場面は下記のように考えて頂ければいいと思います。
ラムダ式を使用する場面:メソッド内で行う処理が簡単な場合
この処理をわざわざメソッドにする必要ないなと思ったら、ラムダ式を使っていきましょう。
因みにLinqは、ラムダ式の処理が既に書かれていて、それを利用していただけです。
今回の記事は以上です。ラムダ式どんどん使用して、知識を吸収してくださいね。
最後まで見て頂き有難うございました。
Actionを使用した記事を書きました。下記の記事もぜひみてください。
こちらもCHECK
-
【C# sharp Linq】Func、Actionメソッドを使用し、If文を削減しよう!
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る
他のLinqの記事についてはこちら