0. 前提
この記事はリストや配列などを用いる時に何度も使うfor
を1つにまとめよう!という記事です。
指摘などありましたら、ぜひコメントお願いします。
※あくまで、こういう方法があるというだけで、絶対に推奨するというものではありません。
1. 変更前
Character.cs
public class Character
{
private bool isAlive = true;
public void Attack() {//攻撃処理}
public void Guard() {//防御処理}
public bool IsAlive()
{
return isAlive;
}
}
Main.cs
private List<Character> characters = new List<Character>();
void CharacterAttack()
{
for (int i = 0; i < characters.Count; i++)
{
characters[i].Attack();
}
}
void CharacterGuard()
{
for(int i = 0; i < characters.Count; i++)
{
if(characters[i].IsAlive())
{
characters[i].Guard();
}
}
}
こんな感じのがあったとします。
2. for文をまとめる
for文を1つにするために以下を作成します。
void Each<T>(List<T> list, Action<T> action, Func<T,bool> func = null)
{
for (int i = 0; i < list.Count; i++)
{
if (func())
{
action(list[i]);
}
}
}
※引数について
第一引数(list) ・・・ 処理を行う要素のリスト
第二引数(action) ・・・ 各要素が行う処理
第三引数(func) ・・・ 処理を行う条件(省略可能)
となっています。
Main
private List<Character> characters = new List<Character>();
void CharacterAttack()
{
Each(characters, CallAttack);
}
void CallAttack(Character character)
{
character.Attack();
}
void CharacterGuard()
{
Each(characters, (character) => character.Guard(), (character) => character.IsAlive());
}
Attackはそのままの使い方
Guardはラムダ式を利用した使い方になっています。
このように毎回for文を書く必要がなくなります!
これが2次元の配列などになってくるとよりメリットを感じれると思います。
3. 最後に
いかがでしたでしょうか?
慣れないと読みにくいと感じると思いますが、コードがかなりスッキリします。
それぞれの状況に合わせて、利用するか考えてみて頂けたらと思います。