public void GetRowTest()
 {
     var matrix = new[,]
     {
         {1, 2, 3},
         {4, 5, 6},
         {7, 8, 9},
         {10,11,12}
     };
     var expected = new[] { 4, 5, 6 };
     var result = matrix.GetRow(1);
     CollectionAssert.AreEqual(expected, result);
 }
        private static List<CommandState> GetCommandStateList(IList<IBattleCommand> commandList)
        {
            const int O = 0; // 使用可能
            const int X = 1; // 使用不可能
            const int N = 2; // 非表示
            var commandEnableTable = new[,] {
                // 移動, 攻撃, 魔法, 特技, 待機
                { O, O, O, O, O }, // 初期
                { X, O, X, O, O }, // 移動済み
                { X, X, X, X, O }, // 行動済み
            };

            var stateTransion = new[,] {
                // 移動, 攻撃, 魔法, 特技, 待機
                { 1, 2, 2, 2, 2 }, // 初期
                { 2, 2, 2, 2, 2 }, // 移動済み
                { 2, 2, 2, 2, 2 }, // 行動済み	HACK: 本当は不要?
            };

            var states = new List<CommandState>();
            foreach (var commandEnable in commandEnableTable.GetRows())
            {
                var cmds = new List<CommandInfo>();
                commandEnable.ForEach((enable, i) => {
                    if (enable != N)
                        cmds.Add(new CommandInfo(commandList[i], enable == O));
                });

                var state = new CommandState();
                state.CommandInfos = cmds;
                states.Add(state);
            }

            stateTransion.GetRows().ForEach((trans, i) => {
                var transTable = new Dictionary<IBattleCommand, CommandState>();
                commandEnableTable.GetRow(i)
                    .Zip(trans)
                    .ForEach((t, j) => {
                        // 使用可能ならば状態遷移を生成
                        if (t.Item1 == O)
                            transTable.Add(commandList[j], states[t.Item2]);
                    });
                states[i].Transition = transTable;
            });

            return states;
        }