13,038
回編集
(→式木データ) |
(→ラムダ式) |
||
| 19行目: | 19行目: | ||
デリゲートの作成において、C# 3.0で追加されたラムダ式を使用することで、匿名メソッドよりも簡潔に記述できる。<br> | デリゲートの作成において、C# 3.0で追加されたラムダ式を使用することで、匿名メソッドよりも簡潔に記述できる。<br> | ||
また、IEnumerable<T>を実装したクラスであればインスタンスメソッドとして記述できる。<br> | また、IEnumerable<T>を実装したクラスであればインスタンスメソッドとして記述できる。<br> | ||
<br> | |||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
// 匿名メソッド | // 匿名メソッド | ||
| 36行目: | 37行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
<syntaxhighlight lang=" | ==== Action ==== | ||
Actionは、パラメータを受け取り、戻り値を返さないデリゲート (メソッドを参照する型) である。<Br> | |||
戻り値がない (voidを返す) メソッドを表現する場合に使用する。<br> | |||
<br> | |||
引数は0〜16個までのパラメータを受け取ることが可能である。<br> | |||
コンソール出力やデータの保存等の処理に使用されることが多い。<br> | |||
<br> | |||
マルチスレッドでGUIを処理する場合にも、invokeメソッドと同時に使用することがある。<br> | |||
詳細は、[[C_Sharpの基礎_-_マルチスレッドとGUI#Invokeメソッドを使う]]を参照すること。<br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
// Actionの基本 | |||
Action sayHello = () => Console.WriteLine("Hello, Action"); | |||
sayHello(); // 出力: Hello, Action | |||
// 引数が1つのAction | |||
Action<string> greet = (name) => Console.WriteLine($"Hello, {name}!"); | |||
greet("John"); // 出力: Hello, John! | |||
// 引数を2つのAction | |||
Action<int, int> printSum = (x, y) => Console.WriteLine($"Sum: {x + y}"); | |||
printSum(5, 3); // 出力: Sum: 8 | |||
// コレクション処理 (リストの各要素を2倍にする) | |||
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; | |||
Action<int> twiceNumber = (n) => Console.WriteLine($"Number: {n * 2}"); | |||
numbers.ForEach(twiceNumber); | |||
// イベントハンドリング | |||
Action<string> logMessage = (message) => Console.WriteLine($"Log: {message}"); | |||
// メソッドの引数にする | |||
void ProcessItems<T>(IEnumerable<T> items, Action<T> processor) | |||
{ | { | ||
var | foreach (var item in items) | ||
{ | { | ||
" | processor(item); | ||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== Func ==== | |||
Funcとは、パラメータを受け取り、値を返すデリゲートである。<br> | |||
最後の型パラメータが戻り値の型を表す。<br> | |||
<br> | |||
0〜16個までの入力パラメータを受け取ることができる。<br> | |||
<br> | |||
Funcは、値の変換や計算処理によく使用されている。<br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
// Funcの基本 | |||
Func<int> getRandomNumber = () => new Random().Next(1, 100); | |||
int random = getRandomNumber(); // 1〜100までのランダムな数値を取得 | |||
// 引数を1つ受け取り、戻り値を返すFunc | |||
Func<int, bool> isEven = (number) => number % 2 == 0; | |||
bool result = isEven(4); // true | |||
// 引数が2つでdouble型の戻り値を返すFunc | |||
Func<int, int, double> calculateAverage = (x, y) => (x + y) / 2.0; | |||
double average = calculateAverage(10, 15); // 12.5 | |||
// コレクション処理 (リストの要素を変換) | |||
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; | |||
Func<int, string> numberToString = (n) => $"Value: {n}"; | |||
List<string> stringNumbers = numbers.Select(numberToString).ToList(); | |||
// 条件付き処理 | |||
Func<int, string> gradeScore = (score) => { | |||
if (score >= 90) return "A"; | |||
if (score >= 80) return "B"; | |||
if (score >= 70) return "C"; | |||
if (score >= 60) return "D"; | |||
return "F"; | |||
}; | |||
int studentScore = 85; | |||
string grade = gradeScore(studentScore); // "B" | |||
// 引数にFuncを渡す | |||
public static T TransformData<T>(string input, Func<string, T> transformer) | |||
{ | |||
return transformer(input); | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | |||
==== コレクション処理 ==== | |||
<syntaxhighlight lang="csharp"> | |||
var names = new List<string> | |||
{ | |||
"Taro", | |||
"Jiro", | |||
"Saburo" | |||
}; | |||
int count = CountList(names, str => str.Length < 5); | |||
</syntaxhighlight> | |||
<br> | |||
==== LINQとの連携 ==== | |||
LINQの各メソッドと組み合わせることにより、効率的なコレクション処理が可能である。<br> | |||
<br> | <br> | ||
以下の例では、LINQのCountメソッドを記述している。<br> | 以下の例では、LINQのCountメソッドを記述している。<br> | ||
<br> | |||
拡張メソッドであるCountメソッドは、IEnumerable<T>型の拡張メソッドであり、引数はFunc<TSource, bool>型である。<br> | |||
また、Countメソッドは、nullチェック等の処理も含まれている。<br> | |||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
int count = names.Count(str => str.Length < 5); | int count = names.Count(str => str.Length < 5); | ||
| 58行目: | 149行目: | ||
<br> | <br> | ||
また、拡張メソッドと型推論を知ることで、LINQをより理解することができる。<br> | また、拡張メソッドと型推論を知ることで、LINQをより理解することができる。<br> | ||
LINQの詳細は、[[LINQ - 拡張メソッド一覧|C_Sharpの基礎 - LINQ]]を参照すること。<br> | |||
<br> | <br> | ||
==== 式木データ ==== | ==== 式木データ ==== | ||