今回のテーマ
こんばんは、サルモリです。
今回は、下記のテーマについて書いていきます。
今回のテーマ
ラムダ式について
今回はラムダ式について、理解するためにデリゲートの解説をしていこうと思います。
今までLinqのメソッドや使い方について、解説してきました。
Linqの書き方は今回紹介するデリゲートを省略した書き方なのです。
なので、今回の記事のソースコードは覚える必要はなく、元はこんな書き方だったんだなーって感覚でいいです。しかし、デリゲートを使うことによるメリットは解説するので、そこだけは覚えてください。
今回の記事を順番にみていくことで、Linqの理解にもきっとつながるとおもうので、紹介していきたいと思います。
CHECK
-
【C# sharp Linq】Selectメソッド、Whereメソッドを解説します。
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 C#言語のL ...
続きを見る
他の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 |
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)); } } class Calc { public delegate bool Judgement(int value); public int Count(int[] array) { int count = 0; foreach(var n in array) { if (n % 2 == 0) count++; } return count; } } } |
result
4
上記のメソッドはCalcクラスに定義されており、配列の中から偶数の個数を返すメソッドです。
このメソッドでは、別の条件でカウントを行いたい場合には利用することができません。例えば、奇数の要素の個数などです。
上記のようなことをデリゲートを使用すれば実現できます。
デリゲートを使ってみよう
早速デリゲートを使用してみましょう。
デリゲートを使う例
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 |
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)); } public static bool IsEven(int n) { return n % 2 == 0; } } 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
デリゲートを使う例のポイントは下記の3つです。
24行目:デリゲートの宣言
11行目:デリゲートの変数に関数を代入している
30行目:代入した関数の結果で判定する
まず、デリゲートの宣言方法は24行目のように記述すればできます。ここで重要なのは、引数の型と戻り値の型です。
11行目のように代入できる関数は引数の型と戻り値の型が一致してれば大丈夫です。今回の場合では、引数はint型、戻り値の型はbool型ですね。
30行目では、デリゲートで宣言した変数の引数をint型で指定してあげれば、bool型で結果を返してくれます。
デリゲートを使用すれば、奇数の個数が欲しい場合でも、別に関数を作って代入すれば
呼び出される側の関数を変更することなく、実現することができます。
下記に偶数と奇数の個数を呼び出すソースコードを書いていきます。
デリゲートを使う例
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
偶数の要素の数と奇数の要素の数それぞれ返して出力していますね。
まとめ
今回はデリゲートについて学びました。
デリゲートのメリットについてはこの記事を見直して頂ければ、すぐに分かるとおもうので、何回も読み直してください。
次の記事では、デリゲートの書き方をもっと簡潔に書き、ラムダ式の形にしていきます。
今回の記事は以上です。最後まで見て頂きありがとうございました。
他のLinqの記事についてはこちら