前回は,delegateを使うことで,判定方法を外から渡せるようになることを解説しました。ただ,前回作成したShiki1やShiki2は判定する桁数が固定されていました。
private bool Shiki2(string value) { return value.Length >= 4; }
このように,Shiki2であれば,「4文字以上」というように,「4」という桁数が固定されいます。この桁数を可変的に指定できるように,桁数の引数を追加し,桁数が2つのdelegateを作成してみたいと思います。
ボタンの追加
2つの引数でのdelegateを作成するために,またボタンを1つ増やします。button5を追加してダブルクリックをし,クリックイベントを自動生成します。
前回作成したdelegateは, stringの引数が1つでした。
delegate bool LenCheck(string value);
今回これに加えて 桁数も追加したいので, 新たにdelegateを作成したいと思います。
新しいdelegate
前回作成したdelegateと同じような感じで 新しいイベントを作成します。
delegate bool LenCheck5(string value, int len);
異なる点は,「int len」という,intの引数が1つ増えているということです。あとdelegateの名前は同じものが使えないのでLenCheck5としています。なぜ「5」なのかというと,ボタンの番号と合わせているということです。もちろん名前は何でもかまいません。
これでstringと桁数であるlenを投げたらboolを返却するというdelegateが作成できました。
GetValueメソッドの作成
ここまでで,新しいdelegate作成 したので,新しいGetValueメソッドを作成します。
名前はボタンに合わせてGetValue5とします。
private string[] (string[] values, int len, LenCheck5 lenCheck) { var result = new List(); foreach (var val in values) { if (lenCheck(val, len)) { result.Add(val); } } return result.ToArray(); }
引数は先ほど作成したdelegateであるLenCheck5を受け入れるようにしますが,その際は,桁数の指定も必要になるため,「int len」の引数も追加しています。
lenCheckの型がLenCheck5となったため,if文のlenCheckでは,第2引数に桁数を指定する必要が出てきます。ここにメソッドの引数である「len」を指定すれば,LenCheck5のdelegateにチェックする文字列と,桁数が引き渡されます。
新しい式の定義
ここまででdelegateのLenCheck5と,そのdelegate使用するメソッドであるGetValue5を作成しました。ここでは,そのLenCheck5に対応するメソッド(式)を定義していきます。例えばこんな感じで定義します。
private bool Shiki3(string value,int len) { return value.Length == len; } private bool Shiki4(string value, int len) { return value.Length >= len; }
Shiki3とShiki4を定義してみました。 どちらも stringとintを引数にし,boolを返却する メソッドの定義です。これはLenCheck5で定義した定義と同じ定義なので,LenCheck5として扱うことができるわけです。2つ作った理由は,判定方法を微妙に変えています。それぞれが汎用的に使用できるメソッドになっています。
Shiki3では,引数の桁数と同じ時にTrueを返却するメソッドを定義しました。「==」で判定する場合は,桁数を自由に変更できるためこの式は汎用的に使用することができます。Shiki4では「>=」で判定する式を作成しました。これも引数で桁数を自由に変更できるため,「>=」で判定する際に,汎用的に使用できるメソッドになっています。
button5_Clickイベントの実装
ここまで出来たら,それを呼び出すためのbutton5_Clickイベントを実装します。button4_Clickの中身をコピーして,GetValue5を呼び出すように変更すれば,簡単に実装することができます。
private void button5_Click(object sender, EventArgs e) { var values = new string[] { "A", "BB", "CCC", "DDDD", "EEEEE" }; var result = GetValue5(values,3, Shiki3); Console.WriteLine(string.Join(",", result)); }
GetValue5では,引数が,string[],int,LenCheck5になっているため,それに対応させます。string[]は今まで通り,valuesでOKですね。intの部分はチェックする桁数になります。今回は3にしておきましょう。LenCheck5の部分は,今回メソッドを2つ作成したので,どちらを指定しても動作します。Shiki3とShiki4ですね。「==」でチェックしたい場合は「Shiki3」,「>=」でチェックしたい場合は,「Shiki4」を引数にセットすれば,それに従って動作するということです。今回は「Shiki3」を設定してみましょう。
実行
この状態で実行し,button5を押下すれば,結果を確認できます。
「CCC」と出力されていましす。今回は「Shiki3」を設定し,桁数を3にしたため,3桁イコールの文字列のみが出力されることになり,その結果「CCC」のみが出力されているということになります。これでdelegateのLenCheck5が正しく動作していることが確認できました。GetValue5を呼び出すときの引数を,3以外の数値にすれば,異なる桁数でチェックされることが確認できるはずです。またShiki4を引数として渡すことで,「>=」で判定される事の確認できます。値をいろいろ変えて,確認してみてください。
#02_プロジェクトの作成
#03_ラムダなしで実装
#04_ラムダなしで実装_共通関数
#05_ラムダなしで実装_引数追加
#06_delegateを定義する方法
#07_delegateの使い方
#08_delegate_引数2つ
#09_匿名メソッドの使いかた
#10_Predicateの使い方
#コラム_C#の歴史とここまでのまとめ
#11_ラムダ式の書き方
#12_ラムダ式の実装
#13_FuncとActionとは
#14_Funcの実装とラムダ式複数パラメータの書き方
#15_ラムダの右辺が複数行の時の書き方
#16_Actionのパラメータありの実装
#17_Actionのパラメータありとラムダ式の書き方
#18_Actionのパラメータなしと引数なしのラムダ式の書き方
#19_コレクションに対する代表的なラムダ式の書き方
#20_カスタムクラスのコレクションに対するラムダの書き方