コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】Arrayクラスのstatic関数をList<T>のメンバ関数のように使用できるようにする拡張メソッド

概要

var characters = new Character
{
    new Character{ Job = "王国兵士" }, 
    new Character{ Job = "魔法使い" }, 
};
var soldier = Array.Find(characters, c => c.Job == "王国兵士");
int index = Array.FindIndex(characters, c => c.Job == "王国兵士");

Arrayクラスには配列を効率的に扱うための関数が多く用意されていますが
個人的には下記のようにList<T>と同じ構文で使用したかったので

var characters = new Character
{
    new Character{ Job = "王国兵士" }, 
    new Character{ Job = "魔法使い" }, 
};
var soldier = characters.Find(c => c.Job == "王国兵士");
int index = characters.FindIndex(c => c.Job == "王国兵士");

次のようなソースコードを用意して使用しています

var characters = new Character[10];

// 読み取り専用の配列に変換
characters.AsReadOnly();

// 配列の中身を 0 や false, null に初期化
characters.Clear();

// 条件を満たす要素が存在するかどうか
characters.Exists(c => c.Job == "王国兵士");

// 条件を満たす要素を取得
characters.Find(c => c.Job == "王国兵士");

// 条件を満たす要素をすべて取得
characters.FindAll(c => c.Job == "王国兵士");

// 条件を満たす要素のインデックスを取得
characters.FindIndex(c => c.Job == "王国兵士");

// 条件を満たす最後の要素を取得
characters.FindLast(c => c.Job == "王国兵士");

// 条件を満たす最後の要素のインデックスを取得
characters.FindLastIndex(c => c.Job == "王国兵士");

// すべての要素に指定した関数を実行
characters.ForEach(c => Debug.Log(c.Job));

// 指定したオブジェクトに等しい要素のインデックスを取得
characters.IndexOf(soldier);

// 指定したオブジェクトに等しい最後の要素のインデックスを取得
characters.LastIndexOf(soldier);

// 中身を反転
characters.Reverse();

// すべての要素が条件を満たすかどうか
characters.TrueForAll(c => c.Job == "王国兵士");

// characters[characters.Length - 1]と等価
characters.Last();

関連記事