在c#中初始化多维数组(使用其他数组)

本文关键字:数组 其他 初始化 | 更新日期: 2023-09-27 18:06:56

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

I have to go:

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

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

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

在c#中初始化多维数组(使用其他数组)

如果您切换到锯齿数组,这将工作:

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

您正在尝试将数组引用分配给数组。更多详细信息请阅读-锯齿数组。

试试这个,

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

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

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

下面的代码可以正常运行:

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