使用foreach在2D阵列中迭代

本文关键字:迭代 阵列 2D foreach 使用 | 更新日期: 2023-09-27 18:28:50

我试图用以下语句迭代数组:foreach(arr2D中的int[]arr)。它在Java中的工作原理类似。为什么它在C#中不起作用?谢谢

public static int[] RowSums(int[,] arr2D)
{
  int[] sums = new int[arr2D.Length];
  int rowCount = 0;
  foreach (int[] arr in arr2D)
  {
    sums[rowSums] = ArraySum(arr);
    rowSums++;
  } 
  return sums;
} 

使用foreach在2D阵列中迭代

int[,]不是int[]的IEnumerable,而是int的IEnumarable。因此,您不能像在foreach循环中那样使用它。此外,您必须使用Array.GetLength()方法来找出每行中的元素数量。

public static int[] RowSums(int[,] arr2D)
{
    int numRows = arr2D.GetLength(0);
    int numColumns = arr2D.GetLength(1);
    int[] sums = new int[numRows];
    for (int row = 0; row < numRows; ++row)
    {
        for (int col = 0; col < numColumns; ++col)
        {
            sums[row] += arr2D[row, col];
        }
    }
    return sums;
}

使用列表<>对象和Linq使代码成为琐碎的

        public static List<int> RowSums(List<List<int>> arr2D)
        {
            return arr2D.Select(x => x.Sum()).ToList();
        }​

这不是解决问题的正确方法。您目前使用的是多维数组(int[n,n]),这些数组没有提供任何处理行或列的方法(假设您使用的是三维数组->行的含义是什么?)。如果要将值作为行进行迭代,则应使用锯齿状数组(int[n][])。你的代码会变成类似的东西:

public static int[] RowSums(int[][] arr2D)
    {
        //declare variables
        int[] sums = new int[arr2D.GetLength(0)];
        int rowSums = 0;
        //loop through array rows
        foreach (int[] arr in arr2D)
        {
            //accumulate row sum
            sums[rowSums] = ArraySum(arr);
            //update counter
            rowSums++;
        } //end foreach
        return sums;
    } //RowSums