2nd term 6th week - dsuz/csharp GitHub Wiki
今回のテーマ
- System.Func
- 匿名関数
- ラムダ式
- Linq
準備
CSharp2-6.zip をダウンロードして展開し、.sln ファイルを Visual Studio で開き、実行してみましょう。
System.Func
System.Action と System.Func の違いは、Action は戻り値なしだが、Func は戻り値があり、その型を含んでいる、という点である。System.Func はこの次に扱う「ラムダ式」で頻繁に使われる。
System.Action<T0, T1, T2, ...> の Tn は全て「引数の型」だが、System.Func<T0, T1, T2, ..., Tn, TResult> については「Tn は引数の型で、 TResult は戻り値の型」 というルールを覚えておくこと。
LINQ とは
配列 (array) やリスト (list) に対してメソッドを追加し、そのメソッドによりデータを操作することができる。
今回の例ではデータ操作として「抽出」(配列から指定した条件を満たす要素のみを抽出する)と「並べ替え」(計算結果の値の昇順・降順に並べ替える)を行っている。
それ以外にどのような操作ができるかは参考資料を参照すること。
また、抽出時の条件指定や並べ替えをする時の「どのような順番に並べ替えるか」を指定するためにデリゲートを使ってメソッドを渡している。この記述に「ラムダ式」を使うとプログラムがとても短くなる。
参考資料
- 独習 C# 第10章 ラムダ式/LINQ
- [完全版]究極のC#プログラミング ――新スタイルによる実践的コーディング
- delegate の仕組みは C# のバージョン 1.0 からあった。ジェネリック、匿名メソッド、System.Action, System.Func はバージョン 2 で、ラムダ式と LINQ は C# のバージョン 3 で追加された。基本的な C# の使い方はわかった上で LINQ 等の新機能を学びたい場合はこの本が都合がよい。
- Web 版として 究極のC#プログラミング と、その元となった C# 3.0 入門 がある
課題
ソリューションを "2 Lambda Expression Exercise" プロジェクトに切り替え、Program.cs を開き、以下の課題に解答せよ。
課題1(1点)
以下のように変数 stringArray が宣言されている。
string[] stringArray = { "banana", "orange", "kiwi", "apple", "pineapple" };
Linq を使って、stringArray から「文字列の長さが 5 文字より長い要素」を抽出し、出力せよ
課題2(1点)
以下のように変数 intArray が宣言されている。
int[] intArray = { 9, 3, 5, 8, 1, 7, 2, 4, 6, 0 };
Linq を使って、intArray から偶数を抽出し、出力せよ
Unity での使用例
CSharp2-6.unitypackage をダウンロードして Unity プロジェクトにインポートし、"Linq" シーンを開いて実行する。
照準の動きを制御する Crosshair スクリプト コンポーネントと、爆弾を見えなくする BombManager スクリプト コンポーネントに Linq・匿名関数・ラムダ式の使用例がある。
課題
課題3(5点)
今までに作ったプログラムから、ラムダ式を使って記述が簡単にできるものを探し、ラムダ式を使った記述方法に変更せよ。変更したら、GitHub を使ってその箇所のリンクを提出せよ。