【问题标题】:Initializing multidimensional arrays in c# (with other arrays)在c#中初始化多维数组(与其他数组)
【发布时间】:2023-03-04 03:05:02
【问题描述】:

在 C# 中,可以使用如下常量初始化多维数组:

Object[,] twodArray = new Object[,] { {"00", "01", "02"}, 
                                      {"10", "11", "12"},
                                      {"20", "21", "22"} };

我个人认为用硬编码常量初始化一个数组对于测试练习之外的任何事情都是无用的。无论如何,我迫切需要做的是使用现有数组初始化一个新的多维数组。 (它们具有相同的项目数,但内容当然只在运行时定义)。

我想做的一个例子是。

Object[] first  = new Object[] {"00", "01", "02"};
Object[] second = new Object[] {"10", "11", "12"};
Object[] third  = new Object[] {"20", "21", "22"};
Object[,] twodArray = new Object[,] { first, second, third };

很遗憾,这不能编译为有效代码。有趣的是,当我尝试时

Object[,] twodArray = new Object[,] { {first}, {second}, {third} };

代码确实编译并运行了,但结果并不理想 - 一个 3 x 3 的对象数组,结果是一个 3 x 1 的数组数组,每个数组有 3 个元素。发生这种情况时,我无法使用以下方法访问我的数组:

Object val = twodArray[3,3];

我得走了:

Object val = twodArray[3,1][3];

这显然不是我们想要的结果。

那么,有没有什么方法可以从多个现有数组中初始化这个新的二维数组,而无需借助迭代?

【问题讨论】:

  • Does Object[] { first, second, third };有意义而不是 Object[,] { first, second, third }; (去除维度昏迷) ?应记为 twoarray[3][3]

标签: c# arrays multidimensional-array initialization


【解决方案1】:

如果您切换到锯齿状数组,这将起作用:

int[] arr1 = new[] { 1, 2, 3 };
int[] arr2 = new[] { 4, 5, 6 };
int[] arr3 = new[] { 7, 8, 9 };

int[][] jagged = new[] { arr1, arr2, arr3 };

int six = jagged[1][2];

编辑为以后发现此线程的人澄清

上面的代码示例也不够充分,因为它会生成数组数组 (object[object[]]) 而不是锯齿状数组 (object[][]) 它们在概念上是相同的,但类型不同。

【讨论】:

  • 我意识到数组的数组是可能的,但是每一行中的项目数量相同,因此二维数组确实是我所追求的结构。多维数组创建了一个很好的线性内存布局,而锯齿状数组意味着几个额外的间接级别。
  • 另外,为了记录,我尝试了int[][] jagged = new[] { arr1, arr2, arr3 };,但我得到的是一个 int[3][](未初始化的第二维),前 3 项是数组。还不如刚刚做完int[] jagged = new[] { arr1, arr2, arr3 };
  • 公平点,在这种情况下答案是否定的,没有办法以这种方式仅使用数组初始化器语法来初始化多维数组:(
  • @Alain 使用这种基于集合的编程,您可能会发现像 F# 这样的函数式语言更适合您的需求 :)
  • 仅从数组消费者的角度来看,概念上相同。 Aaand 数组数组可以包含不同长度的数组... C# 中的锯齿状“数组”通常实现为 arr[a, b]
【解决方案2】:

您正在尝试将数组引用分配给数组。更多详情请阅读-Jagged Arrays.

试试这个,

Object[] first = new Object[] { "00", "01", "02" };
Object[] second = new Object[] { "10", "11", "12" };
Object[] third = new Object[] { "20", "21", "22" };
Object[][] result = { first, second, third };

foreach (object [] ar in result)
   {
       foreach (object ele in ar)
        {
            Console.Write(" " + ele);
          }
       Console.WriteLine();
   }

【讨论】:

    【解决方案3】:

    我很难完全理解您真正想要实现的目标。如果我没记错的话,您有一些字符串“列表”,您需要将它们存储在另一个列表中。

    首先,我建议您使用比数组更现代的方法。 C# 为您提供 IEnumerable 和 IList 接口以及从它们派生的所有东西,因此无需坚持使用老式数组。

    你可以这样做:

    var list1 = new List<string> { "foo1", "foo2", "foo3" };
    var list2 = new List<string> { "foo4", "foo5", "foo6" };
    var list3 = new List<string> { "foo7", "foo8", "foo9" };
    var listOfStrings = new List<List<string>> { list1, list2, list3 };
    

    如果你想访问“foo6”,你写:

    var temp = listOfStrings[1][2];
    

    【讨论】:

    • 数组什么时候过时了? .NET 中几乎所有的集合类都不过是修饰数组。
    • 我以字符串为例。我正在尝试将二维对象数组放在一起。不是一维数组。
    【解决方案4】:

    以下工作正常:

    var a = new object[] { 0, 1, 1, 2 };
    var b = new object[] { "0", "5", "0", "0" };
    var c = new object[] { true, true, true, false };
    
    object[][] m = new object[][] { a, b, c };
    
    
     var two = m[0][3];
     var bar = m[1][1];
     var f = m[2][3];
    
    

    【讨论】:

    • 将近十年的问题。那么,你对accepted的回答有什么不同呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多