在c#中初始化多维数组(与其他数组一起)

时间:2011-08-26 13:30:58

标签: c# arrays multidimensional-array initialization

在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];

这显然不是理想的结果。

那么,有没有办法从多个现有数组初始化这个新的2D数组而不需要迭代?

4 个答案:

答案 0 :(得分:5)

如果您切换到锯齿状数组,这将有效:

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

答案 1 :(得分:1)

我正在努力完全理解你真正想要实现的目标。如果我做对了,你有一些字符串的“列表”,你需要存储在另一个列表中。

首先,我建议您使用比阵列更现代的方法。 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];

答案 2 :(得分:1)

您正在尝试将数组引用分配给数组。有关详细信息,请阅读 - 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 :(得分:0)

以下工作正常:

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