順序が保存できるリストっていうとLinkedListがよさそうに思った。これはどうやら環状バッファを使って実装しているっぽい。位置を指定して前後への追加や、リストの先頭、最後への追加が非常に得意な感じでタスクスケジューリングには都合がよさそうだ。
しかし・・・。一つだけ残念なのはノード比較をユーザー定義できないのだ。あるSceneをFindしておいてその後ろへAddBeforeとかしたいのだがデフォルトの比較じゃなくてたとえばシーン固有番号など与えてそれによって同じようなSceneも区別つけたいのだが・・・。うーん。構造的にGenericのFindも使えないみたいだし非常に残念。できれば自作は避けたいなあ。もうちょい調べてみよう。
(こんな風にしたいの図)
/// <summary>
/// 指定したSceneの前へスケジューリング
/// 例外:ArgumentNullException,InvalidOperationException
/// </summary>
/// <param name="scene">追加位置の後ろになるScene</param>
/// <param name="newScene">新しいScene</param>
internal void AddBefore(SceneBase scene, SceneBase newScene)
{
LinkedListNode<SceneBase> node = sceneList.Find(scene); //★このFindを自前のにしたい
// nodeがnullでもあえてノーチェックでExceptionを起こす仕様。
sceneList.AddBefore(node, newScene);
}
やっぱこういうのを自作するのが普通??LinkedListの構造を知らないとこういうの出せないよねえ?せっかくのフレームワークなのになんかやだ!(駄々っ子^^;)↓
/// <summary>
/// 指定したSceneを探す
/// 戻り:見つかったsceneListのノード。見つからなければnull
/// </summary>
/// <param name="scene">指定Scene</param>
internal LinkedListNode<SceneBase> Find(SceneBase scene)
{
LinkedListNode<SceneBase> node = sceneList.First;
if (node != null) {
do {
if (node.Value.ID == scene.ID) {
return node;
}
} while (node != sceneList.First);
}
return null;
}