前几天我需要一个算法将一个二维网格转化为一个菱形(实际上是旋转45度),这样我就能像处理平面可枚举对象那样处理对角线序列,如下所示:
1 2 3 1
4 5 6 => 4 2
7 8 9 7 5 3
8 6
9
我的算法如下:
public static IEnumerable<IEnumerable<T>> RotateGrid<T>(IEnumerable<IEnumerable<T>> grid)
{
int bound = grid.Count() - 1;
int upperLimit = 0;
int lowerLimit = 0;
Collection<Collection<T>> rotated = new Collection<Collection<T>>();
for (int i = 0; i <= (bound * 2); i++)
{
Collection<T> row = new Collection<T>();
for (int j = upperLimit, k = lowerLimit; j >= lowerLimit || k <= upperLimit; j--, k++)
{
row.Add(grid.ElementAt(j).ElementAt(k));
}
rotated.Add(row);
if (upperLimit == bound)
lowerLimit++;
if (upperLimit < bound)
upperLimit++;
}
return rotated;
}
使用LINQ可以更加简洁地实现这个吗?
甚至只是更加简洁的格式? :)