うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【C#】XY のループが面倒なので拡張してみた

通常 x と y のループを回す場合は下記のように for を2回使ってループを回す

がインデントが上がってしまうので面倒だと思い foreach 一度でループできるようにしてみました

for (var x = 0; x < hogeX; x++)
{
    for (var y = 0; y < hogeY; y++)
    {
    }
}
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public static class LoopExtension
{
    public static IEnumerable<T> XYLoop<T>(T[][] tArray, bool isXBase = true)
    {
        return XYLoop(tArray.GetLength(0), tArray.GetLength(1), isXBase)
            .Select(vi => tArray[vi.x][vi.y]);
    }

    /// <param name="xCount"></param>
    /// <param name="yCount"></param>
    /// <param name="isXBase">Xからループさせるか</param>
    /// <returns></returns>
    public static IEnumerable<Vector2Int> XYLoop(int xCount, int yCount, bool isXBase = true)
    {
        var list = new List<Vector2Int>(xCount * yCount);
        if (isXBase)
        {
            for (var x = 0; x < xCount; x++)
                for (var y = 0; y < yCount; y++)
                    list.Add(new Vector2Int(x, y));
        }
        else
        {
            for (var y = 0; y < yCount; y++)
                for (var x = 0; x < xCount; x++)
                    list.Add(new Vector2Int(x, y));
        }

        return list;
    }
}

これを利用すると下記のようにすることで XY の値が取得できます

が、Linq を利用しているのでループ回数が多ければ GC が多く発生してしまうのが辛いところです

foreach (var pos in LoopExtension.XYLoop(2, 2))
{
    Debug.Log(pos);
}