2nd term 6th week - dsuz/csharp GitHub Wiki

今回のテーマ

  1. System.Func
  2. 匿名関数
  3. ラムダ式
  4. 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) に対してメソッドを追加し、そのメソッドによりデータを操作することができる。

今回の例ではデータ操作として「抽出」(配列から指定した条件を満たす要素のみを抽出する)と「並べ替え」(計算結果の値の昇順・降順に並べ替える)を行っている。

それ以外にどのような操作ができるかは参考資料を参照すること。

また、抽出時の条件指定や並べ替えをする時の「どのような順番に並べ替えるか」を指定するためにデリゲートを使ってメソッドを渡している。この記述に「ラムダ式」を使うとプログラムがとても短くなる。

参考資料

課題

ソリューションを "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 を使ってその箇所のリンクを提出せよ。