Arrays 多维集合迭代的C#缩写?
这可能是一个愚蠢的问题,但我偶尔还是会发现意想不到的窍门… 我经常处理二维和三维数组。我经常需要使用索引遍历所有元素。因此,我最终一遍又一遍地编写相同的嵌套循环结构Arrays 多维集合迭代的C#缩写?,arrays,multidimensional-array,Arrays,Multidimensional Array,这可能是一个愚蠢的问题,但我偶尔还是会发现意想不到的窍门… 我经常处理二维和三维数组。我经常需要使用索引遍历所有元素。因此,我最终一遍又一遍地编写相同的嵌套循环结构 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++) {
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();
}
}
}
for(int i=0;i
我经常需要我的(ijk)迭代器,所以我不是在寻找foreach
我只是想知道是否有一种方法可以用更少的按键来实现类似的效果
多亏了一百万,扩展了创建索引矩阵的思想,您可以为需要使用的每个数组维数创建一组扩展方法,这样就可以从程序逻辑中删除嵌套循环
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]);
}
}
}
您可以使用
元组(或n元组,其中n=维度数)为每个维度创建索引值矩阵,然后在元组列表上创建foreach
。现在有一个想法!似乎满足了甜蜜/击键请求。不知道我在期待什么,但这很聪明。我喜欢这个主意。它类似于我已经做过的事情(使用类似元组的结构),但我从未构建过扩展。一定要试试这个。非常感谢,
set.ForEach((indices, value) => Console.WriteLine("Value at [{0},{1},{2}] = {3}", indices.Item1, indices.Item2, indices.Item3, value));