初始化在c#多维阵列(与其他阵列)

问题描述:

在C#,它可能初始化使用常数像这样多维数组:初始化在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×3数组对象的,哪冒出来的是一个3×1阵列阵列,每个都有3个元素。当这种情况发生,我无法通过访问我的数组:

Object val = twodArray[3,3]; 

我必须去:

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

这显然是不理想的结果。

那么,有没有什么办法来从多个现有的数组初始化这个新的二维数组,而不诉诸迭代?

+0

是否对象[] {第一,第二,第三};有意义而不是Object [,] {first,second,third}; (去除尺寸昏迷)?应该注意为twoarray [3] [3] –

,如果你切换到交错数组这会工作:

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 [] []),它们在概念上是相同的东西,但是不同的类型。

+0

我意识到一个数组的数组是可能的,但每行有相同数量的项目,所以二维数组实际上是我所追求的结构。一个多维数组创建一个很好的线性内存布局,而一个锯齿形数组意味着几个额外的间接级别。 – Alain

+1

另外,为了记录,我尝试了'int [] [] jagged = new [] {arr1,arr2,arr3};'但我得到的是一个int [3] [](第二维未初始化)和前3个项目是数组。可能刚刚完成了'int [] jagged = new [] {arr1,arr2,arr3};' – Alain

+0

公平点,在这种情况下答案是否定的,没有办法以这种方式初始化多维数组完全使用数组初始化语法:( – MattDavey

我很努力地完全理解你真正想要达到的目标。如果我说得对,你有一些“列表”的字符串,你需要存储在另一个列表中。

首先,我建议你使用比数组更现代的方法。 C#为您提供IEnumerable和IList <>接口以及从它们派生的所有东西,因此不需要使用老式的数组。如果要访问“foo6”你写

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 }; 

然后:

var temp = listOfStrings[1][2]; 
+0

的形式实现,因为何时数组是老式的? .NET中几乎所有的集合类都比装饰好的数组稍微多一些.. – MattDavey

+0

我以字符串为例。我正在尝试组合一个二维数组对象。不是数组的一维数组。 – Alain

您正在试图数组引用分配给数组

你可以做这样的事情。欲了解更多详情,请阅读 - 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(); 
    }