デリゲートとラムダ式は、C#プログラムでメソッドを扱う際の強力なツールです。
これらを使ってコードをシンプルにし、読みやすくすることができます。
デリゲートとラムダ式の関係を理解し、基本的な処理の読み解き方を理解しておくことで、
より効率的で柔軟なプログラミングが可能になります。
最後にLINQと高階関数を利用したフィルタリング処理の実装例を提示します。
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class FilterExample : MonoBehaviour
{
[Serializable]
public class Item
{
public string Name;
public int Value;
}
public delegate bool ItemCondition(Item item);
[SerializeField]
private List<Item> items;
private List<Item> FilterItems(ItemCondition condition)
{
return items.Where(condition).ToList();
}
private void ShowItems(string message, List<Item> filteredItems)
{
Debug.Log(message);
foreach (var item in filteredItems)
{
Debug.Log($"アイテム名: {item.Name}, 値: {item.Value}");
}
}
private void Start()
{
// ラムダ式を使って、値が10以上のアイテムを検索する
List<Item> expensiveItems = FilterItems(item => item.Value >= 10);
ShowItems("値が10以上のアイテム:", expensiveItems);
// ラムダ式を使って、名前が "A" で始まるアイテムを検索する
List<Item> itemsStartingWithA = FilterItems(item => item.Name.StartsWith("A"));
ShowItems("名前がAで始まるアイテム:", itemsStartingWithA);
}
}
このコード例では、ItemConditionデリゲートとFilterItems高階関数を使用して、
Startメソッド内で、FilterItemsメソッドを使って異なる条件でアイテムをフィルタリングし、その結果を表示しています。
まず、値が10以上のアイテムを検索し、次に名前が "A" で始まるアイテムを検索しています。
まず、Itemクラスに対する条件を表すデリゲートItemConditionを定義します。
public delegate bool ItemCondition(Item item);
次に、ItemConditionデリゲートを引数にとる高階関数FilterItemsを作成します。
このメソッドは、指定された条件を満たすアイテムを含む新しいリストを返します。
private List<Item> FilterItems(ItemCondition condition)
{
return items.Where(condition).ToList();
}
この condition 引数にはラムダ式で作成された匿名メソッドが代入されています。
そのため、Start メソッドで実行している下記のラムダ式は、デリゲート ItemCondition に代入されます。
List<Item> expensiveItems = FilterItems(item => item.Value >= 10);
ラムダ式は、FilterItems メソッドの引数の item => item.Value >= 10 の部分です。
Item 型の item を引数にとり、item.Value >= 10 を評価して真偽値を返すメソッドを表現しています。
そしてこの匿名メソッドによる内容が、FilterItems 高階関数に用意されているデリゲート ItemCondition 渡されています。
FilterItems メソッド内で items.Where(condition).ToList(); を実行する際に、
このラムダ式(今回であれば item => item.Value >= 10)が代入された ItemCondition デリゲート condition が評価されます。
private List<Item> FilterItems(ItemCondition condition) // condition の値は item => item.Value >= 10
{
return items.Where(condition).ToList(); // Where(condition) メソッドは、Where(item => item.Value >= 10) を行っている
}
つまり、フィルター処理を行う際の
条件部分に「デリゲートとラムダ式」を活用することで、
フィルタリングする条件がその都度変化するようになっています。こうすることでフィルタリング用のメソッドを
複数用意する必要がありません。
そのため、
より抽象化した処理を作成していくことが出来ます。
このように高階関数を使って実装を行うことで、特定のアイテムを検索する、という処理を効率的・抽象的な形で実装していくことが出来ます。
コードがより柔軟で再利用可能になりますし、異なる条件を簡単に追加・変更することができます。