如何在 C# 中访问和重新格式化交错数组

本文关键字:格式化 数组 访问 | 更新日期: 2023-09-27 18:34:27

>我在 c# 中有 2D 数组,如下所示:

int[][] 2darray = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

我怎样才能得到一列作为普通数组,比如

int[] array = 2darray[1][]; //example, not working

并有

int[] array = {3,4};

?谢谢。

如何在 C# 中访问和重新格式化交错数组

代码无法编译的原因有多种

这样它的工作原理:

int[][] array2d = { new[]{ 1, 2 }, new[]{ 3, 4 }, new[]{ 5, 6 }, new[]{ 7, 8 } };
int[] array = array2d[0];

问题:

  • 2darray不是有效的变量名
  • 索引错误
  • 原始数组的初始化错误


编辑:如 @heltonbiker 所述,如果您需要第一列的所有元素,则可以使用以下命令:

int[] col = array2d.Select(row => row[0]).ToArray();

对于具有两列四行的数组,可以通过以下方式使用 LINQ:

using System.Linq;
first_column = _2darray.Select(row => row[0]).ToArray();

请注意,更改第一个或第二个数组不会更改另一个数组。

您在 C# 中混淆了交错数组和多维数组。虽然它们相似,但略有不同。交错数组中的行可以具有不同数量的元素,而在 2D 数组中,它们的长度相同。因此,在使用交错数组时,您需要记住为缺少的列元素编写处理。我在下面编写了一个示例控制台应用程序来展示它们的工作原理 - 它使用 0 作为缺失元素的替代品,但您可以抛出错误等:

using System.Collections.Generic;
namespace JaggedArrayExample
{
    class Program
    {
        static void Main(string[] args)
        {
            //jagged array declaration
            int[][] array1;
            //jagged array declaration and assignment
            var array2 = new int[][] {
                          new int[] { 1, 2 },
                          new int[] { 3, 4 },
                          new int[] { 5, 6 },
                          new int[] { 7, 8 }
                        };
            //2D-array declaration
            int[,] array3;
            //2D-array declaration and assignment (implicit bounds)
            var array4 = new int[,] {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
            //2D-array declaration and assignment (explicit bounds)
            var array5 = new int[4, 2] {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
            //get rows and columns at index
            var r = GetRow(array2, 1); //second row {3,4}
            var c = GetColumn(array2, 1); //second column {2,4,6,8}
        }
        private static int[] GetRow(int[][] array, int index)
        {
            return array[index]; //retrieving the row is simple
        }
        private static int[] GetColumn(int[][] array, int index)
        {
            //but things get more interesting with columns
            //especially if jagged arrays are involved
            var retValue = new List<int>();
            foreach (int[] r in array)
            {
                int ub = r.GetUpperBound(0);
                if (ub >= index) //index within bounds
                {
                    retValue.Add(r[index]);
                }
                else //index outside of bounds
                {
                    retValue.Add(0); //default value?
                    //or you can throw an error
                }
            }
            return retValue.ToArray();
        }
    }
}

试试这个,它应该可以工作

int[] array = array2d[1];

将变量的名称更改为array2d,变量不能以数字开头,变量可以以字母或下划线开头。