这可能是一个愚蠢的问题,但我偶尔会发现意想不到的伎俩......
我经常处理二维和三维数组。我经常需要使用索引来遍历所有元素。所以我最终一遍又一遍地反复编写相同的嵌套循环结构。
for (int i = 0; i < set.GetLength(0); i++) {
for (int j = 0; j < set.GetLength(1); j++) {
for (int k = 0; k < set.GetLength(2); k++) {
set[i,j,k].DoSomething();
}
}
}
我经常需要我的(i j k)迭代器,所以我不是在寻找一个foreach。
我只是想知道是否有办法用更少的击键来实现非常相似的东西?
万分感谢,
答案 0 :(得分:1)
扩展创建索引矩阵的想法,您可以为需要使用的每个数组维度创建一组扩展方法,这样就可以从程序逻辑中删除嵌套循环。
static class ArrayExtensions
{
public static IEnumerable<Tuple<int, int>> GetIndices<T>(this T[,] set)
{
for (var i = 0; i < set.GetLength(0); i += 1)
{
for (var j = 0; j < set.GetLength(1); j += 1)
{
yield return new Tuple<int, int>(i, j);
}
}
}
public static IEnumerable<Tuple<int,int,int>> GetIndices<T>(this T[,,] set)
{
for (var i = 0; i < set.GetLength(0); i += 1)
{
for (var j = 0; j < set.GetLength(1); j += 1)
{
for (var k = 0; k < set.GetLength(2); k += 1)
{
yield return new Tuple<int, int, int>(i, j, k);
}
}
}
}
public static void ForEach<T>(this T[,] set, Action<Tuple<int,int>, T> loopBody)
{
foreach (var indices in GetIndices(set))
{
loopBody(indices, set[indices.Item1, indices.Item2]);
}
}
public static void ForEach<T>(this T[,,] set, Action<Tuple<int, int, int>, T> loopBody)
{
foreach (var indices in GetIndices(set))
{
loopBody(indices, set[indices.Item1, indices.Item2, indices.Item3]);
}
}
}
样本使用:
set.ForEach((indices, value) => Console.WriteLine("Value at [{0},{1},{2}] = {3}", indices.Item1, indices.Item2, indices.Item3, value));