まえがき
こんばんは、かっぱちゃんです。
今回は下記のテーマについて解説します。
今回のテーマ
匿名メソッドとラムダ式について
今回の記事は下記の記事の続きなので、まだ見ていない方は良ければみてください。
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 31 32 33 34 35 36 37 38 39 40 41 42 |
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(); Calc.Judgement judge = IsEven; Console.WriteLine(calc.Count(array,judge)); judge = IsOdd; Console.WriteLine(calc.Count(array, judge)); } public static bool IsEven(int n) { return n % 2 == 0; } public static bool IsOdd(int n) { return 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
デリケートのJudgeに偶数の関数を代入した後、奇数の関数を代入しているソースコードです。
このソースコードのデリケートに対して、匿名メソッドを使用した書き方にしてみます。
匿名メソッドを使用した書き方
匿名メソッドとは、名前の通り名前が存在しないメソッドです。
匿名メソッドを使用することにより、上記のIsEvenやIsOddなどの関数名を指定することなく記述することができます。
早速、ソースコードを見てみましょう。
匿名メソッドを使用した書き方
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, delegate (int n) { return n % 2 == 0; })); Console.WriteLine(calc.Count(array, delegate (int n) { return 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
変更を加えたのは11行目と12行目です。中々テンションの上がる書き方になってきましたね。
二つのソースコードを見比べて頂ければ、処理自体にメソッド名っていらなくない?ってのが実感して頂けたと思います。
でも、まだdelegateという文字列を書かなければならないので、冗長に感じてしまいます。
そこで、ラムダ式を使用すればさらに短く書くことができるのです。
ラムダ式を使用した書き方
続けて、上記のソースコードをラムダ式を使用した方法で書いていきます。
ラムダ式を使用した書き方
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, (int n) => { return n % 2 == 0; })); Console.WriteLine(calc.Count(array, (int n) => { return 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
11行目、12行目をみてください。delegateがなくなり、遂に=>が現れました。=>はdelegateを表していたんですね。
右辺の部分をラムダ式といいます。一種のメソッドとして考えて頂ければいいでしょう。
ラムダ式はさらに簡潔に書くことができるので、これからは11行目と12行目に注目し、さらに簡潔に書けるようにしていきます。
ラムダ式の省略
ラムダ式をさらに省略していきましょう。上記の11行目と12行目のソースコードは下記です。
1 2 |
(int n) => { return n % 2 == 0; } (int n) => { return n % 2 == 1; } |
step
1ラムダ式は{}とreturnを省略することができます。
1 2 |
(int n) => n % 2 == 0 (int n) => n % 2 == 1 |
step
2ラムダ式では引数の型を省略することが可能です。
1 2 |
(n) => n % 2 == 0 (n) => n % 2 == 1 |
step
3ラムダ式では引数が1つの場合は、()を外すことが可能です。
1 2 |
n => n % 2 == 0 n => n % 2 == 1 |
かなり簡潔にすることができましたね。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
色々なラムダ式を渡してみよう
奇数と偶数以外にも色々なラムダ式を渡してみましょう。
例では下記を判別するラムダ式を渡してみます。
- 3以上の値
- 3以下4以上の値
- 1が含まれている数字
色々なラムダ式
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 31 32 33 |
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)); Console.WriteLine(calc.Count(array, n => n > 3)); Console.WriteLine(calc.Count(array, n => n < 3 || 4 < n)); Console.WriteLine(calc.Count(array, n => n.ToString().Contains('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
4
5
2
その他にも色々と試してみてくださいね。
まとめ
今回はデリゲートの書き方からラムダ式の書き方に変換していく記事でした。
ラムダ式って何?ということが少しでも解消されたと思います。全て覚える必要もないので、流れだけでも覚えてくれるといいでしょう。
次の記事はクラスCalcのdelegateの宣言を解消したい方向けの記事を書きたいと思います。
今回も最後まで見て頂き有難うございました。
他のLinqの記事についてはこちら