如何获取二维数组中数字1的所有索引?
How can I get all the indexes of the number 1 in a two-dimensional array?
我有一个如下所示的数组:
int[,] figureL = {{0, 1, 0},
{0, 1, 0},
{0, 1, 1}};
如何获取所有等于1
的数字的索引?所以不仅仅是一个数字,而是所有数字 1's
.
为此,您只想遍历数组的两个维度并查看当前索引处的值是否等于 1。
对于您在此处定义的二维数组,您需要找到 Rank
(它显示数组中有多少维)。您还需要通过调用 figureL.GetUpperBound(rank)
找到每个维度的上限,其中 rank
是当前维度。然后您可以使用该信息来构建循环,循环遍历您的数据结构。
下面是使用上述语法的二维数组枚举示例:
private void Test()
{
int[,] figureL= {
{0,1,0 },
{0,1,0 },
{0,1,1 }
};
Parse(figureL);
}
private void Parse(int[,] input)
{
var dimension1 = input.GetUpperBound(0);
var dimension2 = input.GetUpperBound(1);
for (int i = 0; i <= dimension1; i++)
{
for (int j = 0; j <= dimension2; j++)
{
if (input[i, j] == 1)
Console.WriteLine($"[{i},{j}]");
}
}
}
当然,如果您要处理二维以上的数组,则必须更改此设置,但就目前而言,它应该足以让您开始使用多维数组。
这样的事情怎么样:
int[,] matrix =
{{0, 1, 0},
{0, 1, 0},
{0, 1, 1}};
for (var i = 0; i < matrix.GetLength(0); i++)
{
for (var j = 0; j < matrix.GetLength(1); j++)
{
if (matrix[i, j] == 1)
{
Debug.WriteLine($"index [{i}, {j}] is 1");
}
}
}
matrix.GetLength(int)
调用为您提供两个维度的大小(zero-eth 和第一个)。
输出如下:
index [0, 1] is 1
index [1, 1] is 1
index [2, 1] is 1
index [2, 2] is 1
您可以编写一个 LINQ-like 扩展方法来帮助您在数组中查找任意元素:
public static IEnumerable<(int,int)> FindIndices<T>(this T[,] source, Func<T,bool> predicate)
{
for (int i = 0; i < source.GetLength(0); i++)
{
for (int j = 0; j < source.GetLength(1); j++)
{
if(predicate.Invoke(source[i,j]))
{
yield return (i,j);
}
}
}
}
它将 returns 个满足 predicate
条件的元素索引的元组。用法是
var indices = figureL.FindIndices(x => x == 1);
Online-demo: https://dotnetfiddle.net/tdcwa4
我有一个如下所示的数组:
int[,] figureL = {{0, 1, 0},
{0, 1, 0},
{0, 1, 1}};
如何获取所有等于1
的数字的索引?所以不仅仅是一个数字,而是所有数字 1's
.
为此,您只想遍历数组的两个维度并查看当前索引处的值是否等于 1。
对于您在此处定义的二维数组,您需要找到 Rank
(它显示数组中有多少维)。您还需要通过调用 figureL.GetUpperBound(rank)
找到每个维度的上限,其中 rank
是当前维度。然后您可以使用该信息来构建循环,循环遍历您的数据结构。
下面是使用上述语法的二维数组枚举示例:
private void Test()
{
int[,] figureL= {
{0,1,0 },
{0,1,0 },
{0,1,1 }
};
Parse(figureL);
}
private void Parse(int[,] input)
{
var dimension1 = input.GetUpperBound(0);
var dimension2 = input.GetUpperBound(1);
for (int i = 0; i <= dimension1; i++)
{
for (int j = 0; j <= dimension2; j++)
{
if (input[i, j] == 1)
Console.WriteLine($"[{i},{j}]");
}
}
}
当然,如果您要处理二维以上的数组,则必须更改此设置,但就目前而言,它应该足以让您开始使用多维数组。
这样的事情怎么样:
int[,] matrix =
{{0, 1, 0},
{0, 1, 0},
{0, 1, 1}};
for (var i = 0; i < matrix.GetLength(0); i++)
{
for (var j = 0; j < matrix.GetLength(1); j++)
{
if (matrix[i, j] == 1)
{
Debug.WriteLine($"index [{i}, {j}] is 1");
}
}
}
matrix.GetLength(int)
调用为您提供两个维度的大小(zero-eth 和第一个)。
输出如下:
index [0, 1] is 1
index [1, 1] is 1
index [2, 1] is 1
index [2, 2] is 1
您可以编写一个 LINQ-like 扩展方法来帮助您在数组中查找任意元素:
public static IEnumerable<(int,int)> FindIndices<T>(this T[,] source, Func<T,bool> predicate)
{
for (int i = 0; i < source.GetLength(0); i++)
{
for (int j = 0; j < source.GetLength(1); j++)
{
if(predicate.Invoke(source[i,j]))
{
yield return (i,j);
}
}
}
}
它将 returns 个满足 predicate
条件的元素索引的元组。用法是
var indices = figureL.FindIndices(x => x == 1);
Online-demo: https://dotnetfiddle.net/tdcwa4